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