1 #include <cxxtest/TestSuite.h> 2 #include <libgeodecomp/storage/cudaarray.h> 3 #include <libgeodecomp/misc/cudautil.h> 4 5 #include <cuda.h> 6 7 using namespace LibGeoDecomp; 8 9 namespace LibGeoDecomp { 10 11 class CUDAArrayTest : public CxxTest::TestSuite 12 { 13 public: 14 testBasic()15 void testBasic() 16 { 17 #ifdef LIBGEODECOMP_WITH_CUDA 18 std::vector<double> hostVec1(30, -1); 19 std::vector<double> hostVec2(30, -2); 20 std::vector<double> hostVec3(30, -3); 21 std::vector<double> hostVec4(30, -4); 22 23 for (int i = 0; i < 30; ++i) { 24 hostVec1[i] = i + 0.5; 25 TS_ASSERT_EQUALS(-2, hostVec2[i]); 26 TS_ASSERT_EQUALS(-3, hostVec3[i]); 27 TS_ASSERT_EQUALS(-4, hostVec4[i]); 28 } 29 30 CUDAArray<double> deviceArray1(&hostVec1[0], 30); 31 CUDAArray<double> deviceArray2(hostVec1); 32 CUDAArray<double> deviceArray3(deviceArray1); 33 CUDAArray<double> deviceArray4; 34 deviceArray4 = CUDAArray<double>(30); 35 deviceArray4.load(&hostVec1[0]); 36 37 deviceArray2.save(&hostVec2[0]); 38 deviceArray3.save(&hostVec3[0]); 39 deviceArray4.save(&hostVec4[0]); 40 41 for (int i = 0; i < 30; ++i) { 42 double expected = i + 0.5; 43 TS_ASSERT_EQUALS(expected, hostVec2[i]); 44 TS_ASSERT_EQUALS(expected, hostVec3[i]); 45 TS_ASSERT_EQUALS(expected, hostVec4[i]); 46 } 47 48 TS_ASSERT_DIFFERS(deviceArray1.data(), deviceArray2.data()); 49 TS_ASSERT_DIFFERS(deviceArray1.data(), deviceArray3.data()); 50 TS_ASSERT_DIFFERS(deviceArray1.data(), deviceArray3.data()); 51 52 TS_ASSERT_DIFFERS(deviceArray2.data(), deviceArray3.data()); 53 TS_ASSERT_DIFFERS(deviceArray2.data(), deviceArray4.data()); 54 55 TS_ASSERT_DIFFERS(deviceArray3.data(), deviceArray4.data()); 56 57 cudaDeviceSynchronize(); 58 CUDAUtil::checkForError(); 59 #endif 60 } 61 62 }; 63 64 } 65