Loading src/core/cuda/cuda-prefix-sum.h +10 −0 Original line number Diff line number Diff line Loading @@ -18,7 +18,17 @@ #ifndef CUDA_PREFIX_SUM_H_ #define CUDA_PREFIX_SUM_H_ enum enumPrefixSumType { exclusivePrefixSum = 0, inclusivePrefixSum }; template< typename DataType, template< typename T > class Operation, typename Index > bool cudaPrefixSum( const Index size, const Index blockSize, const DataType *deviceInput, DataType* deviceOutput, const enumPrefixSumType prefixSumType = inclusivePrefixSum ); #endif /* CUDA_PREFIX_SUM_H_ */ src/implementation/core/cuda/cuda-prefix-sum_impl.h +3 −3 Original line number Diff line number Diff line Loading @@ -287,11 +287,11 @@ bool cudaGridPrefixSum( enumPrefixSumType prefixSumType, template< typename DataType, template< typename T > class Operation, typename Index > bool cudaPrefixSum( const enumPrefixSumType prefixSumType, const Index size, bool cudaPrefixSum( const Index size, const Index blockSize, const DataType *deviceInput, DataType* deviceOutput ) DataType* deviceOutput, const enumPrefixSumType prefixSumType ) { /**** * Compute the number of grids Loading src/implementation/core/vectors/tnlVectorOperationsCuda_impl.h +12 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ #ifndef TNLVECTOROPERATIONSCUDA_IMPL_H_ #define TNLVECTOROPERATIONSCUDA_IMPL_H_ #include <core/cuda/cuda-prefix-sum.h> template< typename Vector > void tnlVectorOperations< tnlCuda >::addElement( Vector& v, const typename Vector::IndexType i, Loading Loading @@ -563,7 +565,11 @@ void tnlVectorOperations< tnlCuda >::computePrefixSum( Vector& v, typename Vector::IndexType begin, typename Vector::IndexType end ) { typedef typename Vector::IndexType Index; cudaPrefixSum( end - begin, 256, v.getData()[ begin ], v.getData()[ begin ], inclusivePrefixSum ); } template< typename Vector > Loading @@ -571,7 +577,11 @@ void tnlVectorOperations< tnlCuda >::computeExclusivePrefixSum( Vector& v, typename Vector::IndexType begin, typename Vector::IndexType end ) { cudaPrefixSum( end - begin, 256, v.getData()[ begin ], v.getData()[ begin ], exclusivePrefixSum ); } #ifdef TEMPLATE_EXPLICIT_INSTANTIATION Loading tests/unit-tests/core/vectors/tnlVectorOperationsTester.h +45 −72 Original line number Diff line number Diff line Loading @@ -34,6 +34,9 @@ template< typename Real, typename Device > class tnlVectorOperationsTester : public CppUnit :: TestCase { public: typedef CppUnit::TestCaller< tnlVectorOperationsTester< Real, Device > > TestCallerType; tnlVectorOperationsTester(){}; virtual Loading @@ -44,78 +47,26 @@ class tnlVectorOperationsTester : public CppUnit :: TestCase CppUnit :: TestSuite* suiteOfTests = new CppUnit :: TestSuite( "tnlVectorOperationsTester" ); CppUnit :: TestResult result; suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorMaxTest", &tnlVectorOperationsTester :: getVectorMaxTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorMinTest", &tnlVectorOperationsTester :: getVectorMinTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorAbsMaxTest", &tnlVectorOperationsTester :: getVectorAbsMaxTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorAbsMinTest", &tnlVectorOperationsTester :: getVectorAbsMinTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorLpNormTest", &tnlVectorOperationsTester :: getVectorLpNormTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorSumTest", &tnlVectorOperationsTester :: getVectorSumTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorDifferenceMaxTest", &tnlVectorOperationsTester :: getVectorDifferenceMaxTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorDifferenceMinTest", &tnlVectorOperationsTester :: getVectorDifferenceMinTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorDifferenceAbsMaxTest", &tnlVectorOperationsTester :: getVectorDifferenceAbsMaxTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorDifferenceAbsMinTest", &tnlVectorOperationsTester :: getVectorDifferenceAbsMinTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorDifferenceLpNormTest", &tnlVectorOperationsTester :: getVectorDifferenceLpNormTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorDifferenceSumTest", &tnlVectorOperationsTester :: getVectorDifferenceSumTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "vectorScalarMultiplicationTest", &tnlVectorOperationsTester :: vectorScalarMultiplicationTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getSclaraProductTest", &tnlVectorOperationsTester :: getVectorScalarProductTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "alphaXPlusYTest", &tnlVectorOperationsTester :: alphaXPlusYTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "alphaXPlusBetaYTest", &tnlVectorOperationsTester :: alphaXPlusBetaYTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "alphaXPlusBetaZTest", &tnlVectorOperationsTester :: alphaXPlusBetaZTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "alphaXPlusBetaZPlusYTest", &tnlVectorOperationsTester :: alphaXPlusBetaZPlusYTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorMaxTest", &tnlVectorOperationsTester::getVectorMaxTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorMinTest", &tnlVectorOperationsTester::getVectorMinTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorAbsMaxTest", &tnlVectorOperationsTester::getVectorAbsMaxTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorAbsMinTest", &tnlVectorOperationsTester::getVectorAbsMinTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorLpNormTest", &tnlVectorOperationsTester::getVectorLpNormTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorSumTest", &tnlVectorOperationsTester::getVectorSumTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorDifferenceMaxTest", &tnlVectorOperationsTester::getVectorDifferenceMaxTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorDifferenceMinTest", &tnlVectorOperationsTester::getVectorDifferenceMinTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorDifferenceAbsMaxTest", &tnlVectorOperationsTester::getVectorDifferenceAbsMaxTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorDifferenceAbsMinTest", &tnlVectorOperationsTester::getVectorDifferenceAbsMinTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorDifferenceLpNormTest", &tnlVectorOperationsTester::getVectorDifferenceLpNormTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorDifferenceSumTest", &tnlVectorOperationsTester::getVectorDifferenceSumTest ) ); suiteOfTests -> addTest( new TestCallerType( "vectorScalarMultiplicationTest", &tnlVectorOperationsTester::vectorScalarMultiplicationTest ) ); suiteOfTests -> addTest( new TestCallerType( "getSclaraProductTest", &tnlVectorOperationsTester::getVectorScalarProductTest ) ); suiteOfTests -> addTest( new TestCallerType( "alphaXPlusYTest", &tnlVectorOperationsTester::alphaXPlusYTest ) ); suiteOfTests -> addTest( new TestCallerType( "alphaXPlusBetaYTest", &tnlVectorOperationsTester::alphaXPlusBetaYTest ) ); suiteOfTests -> addTest( new TestCallerType( "alphaXPlusBetaZTest", &tnlVectorOperationsTester::alphaXPlusBetaZTest ) ); suiteOfTests -> addTest( new TestCallerType( "alphaXPlusBetaZPlusYTest", &tnlVectorOperationsTester::alphaXPlusBetaZPlusYTest ) ); suiteOfTests -> addTest( new TestCallerType( "prefixSumTest", &tnlVectorOperationsTester::prefixSumTest ) ); suiteOfTests -> addTest( new TestCallerType( "exclusivePrefixSumTest", &tnlVectorOperationsTester::exclusivePrefixSumTest ) ); return suiteOfTests; }; Loading Loading @@ -418,6 +369,28 @@ class tnlVectorOperationsTester : public CppUnit :: TestCase for( int i = 0; i < size; i ++ ) CPPUNIT_ASSERT( y.getElement( i ) == -1.0 + 3.0 * i ); }; void prefixSumTest() { const int size( 65536 ); tnlVector< Real, Device > v; setOnesSequence( v ); v.computePrefixSum(); for( int i = 0; i < size; i++ ) CPPUNIT_ASSERT( v.getElement( i ) == i ); }; void exclusivePrefixSumTest() { const int size( 65536 ); tnlVector< Real, Device > v; setOnesSequence( v ); v.computePrefixSum(); for( int i = 0; i < size; i++ ) CPPUNIT_ASSERT( v.getElement( i ) == i-1 ); }; }; #else Loading Loading
src/core/cuda/cuda-prefix-sum.h +10 −0 Original line number Diff line number Diff line Loading @@ -18,7 +18,17 @@ #ifndef CUDA_PREFIX_SUM_H_ #define CUDA_PREFIX_SUM_H_ enum enumPrefixSumType { exclusivePrefixSum = 0, inclusivePrefixSum }; template< typename DataType, template< typename T > class Operation, typename Index > bool cudaPrefixSum( const Index size, const Index blockSize, const DataType *deviceInput, DataType* deviceOutput, const enumPrefixSumType prefixSumType = inclusivePrefixSum ); #endif /* CUDA_PREFIX_SUM_H_ */
src/implementation/core/cuda/cuda-prefix-sum_impl.h +3 −3 Original line number Diff line number Diff line Loading @@ -287,11 +287,11 @@ bool cudaGridPrefixSum( enumPrefixSumType prefixSumType, template< typename DataType, template< typename T > class Operation, typename Index > bool cudaPrefixSum( const enumPrefixSumType prefixSumType, const Index size, bool cudaPrefixSum( const Index size, const Index blockSize, const DataType *deviceInput, DataType* deviceOutput ) DataType* deviceOutput, const enumPrefixSumType prefixSumType ) { /**** * Compute the number of grids Loading
src/implementation/core/vectors/tnlVectorOperationsCuda_impl.h +12 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ #ifndef TNLVECTOROPERATIONSCUDA_IMPL_H_ #define TNLVECTOROPERATIONSCUDA_IMPL_H_ #include <core/cuda/cuda-prefix-sum.h> template< typename Vector > void tnlVectorOperations< tnlCuda >::addElement( Vector& v, const typename Vector::IndexType i, Loading Loading @@ -563,7 +565,11 @@ void tnlVectorOperations< tnlCuda >::computePrefixSum( Vector& v, typename Vector::IndexType begin, typename Vector::IndexType end ) { typedef typename Vector::IndexType Index; cudaPrefixSum( end - begin, 256, v.getData()[ begin ], v.getData()[ begin ], inclusivePrefixSum ); } template< typename Vector > Loading @@ -571,7 +577,11 @@ void tnlVectorOperations< tnlCuda >::computeExclusivePrefixSum( Vector& v, typename Vector::IndexType begin, typename Vector::IndexType end ) { cudaPrefixSum( end - begin, 256, v.getData()[ begin ], v.getData()[ begin ], exclusivePrefixSum ); } #ifdef TEMPLATE_EXPLICIT_INSTANTIATION Loading
tests/unit-tests/core/vectors/tnlVectorOperationsTester.h +45 −72 Original line number Diff line number Diff line Loading @@ -34,6 +34,9 @@ template< typename Real, typename Device > class tnlVectorOperationsTester : public CppUnit :: TestCase { public: typedef CppUnit::TestCaller< tnlVectorOperationsTester< Real, Device > > TestCallerType; tnlVectorOperationsTester(){}; virtual Loading @@ -44,78 +47,26 @@ class tnlVectorOperationsTester : public CppUnit :: TestCase CppUnit :: TestSuite* suiteOfTests = new CppUnit :: TestSuite( "tnlVectorOperationsTester" ); CppUnit :: TestResult result; suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorMaxTest", &tnlVectorOperationsTester :: getVectorMaxTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorMinTest", &tnlVectorOperationsTester :: getVectorMinTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorAbsMaxTest", &tnlVectorOperationsTester :: getVectorAbsMaxTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorAbsMinTest", &tnlVectorOperationsTester :: getVectorAbsMinTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorLpNormTest", &tnlVectorOperationsTester :: getVectorLpNormTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorSumTest", &tnlVectorOperationsTester :: getVectorSumTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorDifferenceMaxTest", &tnlVectorOperationsTester :: getVectorDifferenceMaxTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorDifferenceMinTest", &tnlVectorOperationsTester :: getVectorDifferenceMinTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorDifferenceAbsMaxTest", &tnlVectorOperationsTester :: getVectorDifferenceAbsMaxTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorDifferenceAbsMinTest", &tnlVectorOperationsTester :: getVectorDifferenceAbsMinTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorDifferenceLpNormTest", &tnlVectorOperationsTester :: getVectorDifferenceLpNormTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getVectorDifferenceSumTest", &tnlVectorOperationsTester :: getVectorDifferenceSumTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "vectorScalarMultiplicationTest", &tnlVectorOperationsTester :: vectorScalarMultiplicationTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "getSclaraProductTest", &tnlVectorOperationsTester :: getVectorScalarProductTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "alphaXPlusYTest", &tnlVectorOperationsTester :: alphaXPlusYTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "alphaXPlusBetaYTest", &tnlVectorOperationsTester :: alphaXPlusBetaYTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "alphaXPlusBetaZTest", &tnlVectorOperationsTester :: alphaXPlusBetaZTest ) ); suiteOfTests -> addTest( new CppUnit :: TestCaller< tnlVectorOperationsTester >( "alphaXPlusBetaZPlusYTest", &tnlVectorOperationsTester :: alphaXPlusBetaZPlusYTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorMaxTest", &tnlVectorOperationsTester::getVectorMaxTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorMinTest", &tnlVectorOperationsTester::getVectorMinTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorAbsMaxTest", &tnlVectorOperationsTester::getVectorAbsMaxTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorAbsMinTest", &tnlVectorOperationsTester::getVectorAbsMinTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorLpNormTest", &tnlVectorOperationsTester::getVectorLpNormTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorSumTest", &tnlVectorOperationsTester::getVectorSumTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorDifferenceMaxTest", &tnlVectorOperationsTester::getVectorDifferenceMaxTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorDifferenceMinTest", &tnlVectorOperationsTester::getVectorDifferenceMinTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorDifferenceAbsMaxTest", &tnlVectorOperationsTester::getVectorDifferenceAbsMaxTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorDifferenceAbsMinTest", &tnlVectorOperationsTester::getVectorDifferenceAbsMinTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorDifferenceLpNormTest", &tnlVectorOperationsTester::getVectorDifferenceLpNormTest ) ); suiteOfTests -> addTest( new TestCallerType( "getVectorDifferenceSumTest", &tnlVectorOperationsTester::getVectorDifferenceSumTest ) ); suiteOfTests -> addTest( new TestCallerType( "vectorScalarMultiplicationTest", &tnlVectorOperationsTester::vectorScalarMultiplicationTest ) ); suiteOfTests -> addTest( new TestCallerType( "getSclaraProductTest", &tnlVectorOperationsTester::getVectorScalarProductTest ) ); suiteOfTests -> addTest( new TestCallerType( "alphaXPlusYTest", &tnlVectorOperationsTester::alphaXPlusYTest ) ); suiteOfTests -> addTest( new TestCallerType( "alphaXPlusBetaYTest", &tnlVectorOperationsTester::alphaXPlusBetaYTest ) ); suiteOfTests -> addTest( new TestCallerType( "alphaXPlusBetaZTest", &tnlVectorOperationsTester::alphaXPlusBetaZTest ) ); suiteOfTests -> addTest( new TestCallerType( "alphaXPlusBetaZPlusYTest", &tnlVectorOperationsTester::alphaXPlusBetaZPlusYTest ) ); suiteOfTests -> addTest( new TestCallerType( "prefixSumTest", &tnlVectorOperationsTester::prefixSumTest ) ); suiteOfTests -> addTest( new TestCallerType( "exclusivePrefixSumTest", &tnlVectorOperationsTester::exclusivePrefixSumTest ) ); return suiteOfTests; }; Loading Loading @@ -418,6 +369,28 @@ class tnlVectorOperationsTester : public CppUnit :: TestCase for( int i = 0; i < size; i ++ ) CPPUNIT_ASSERT( y.getElement( i ) == -1.0 + 3.0 * i ); }; void prefixSumTest() { const int size( 65536 ); tnlVector< Real, Device > v; setOnesSequence( v ); v.computePrefixSum(); for( int i = 0; i < size; i++ ) CPPUNIT_ASSERT( v.getElement( i ) == i ); }; void exclusivePrefixSumTest() { const int size( 65536 ); tnlVector< Real, Device > v; setOnesSequence( v ); v.computePrefixSum(); for( int i = 0; i < size; i++ ) CPPUNIT_ASSERT( v.getElement( i ) == i-1 ); }; }; #else Loading