| #include <unittest/unittest.h> |
| #include <thrust/device_vector.h> |
| #include <thrust/device_reference.h> |
|
|
| void TestDeviceReferenceConstructorFromDeviceReference(void) |
| { |
| typedef int T; |
|
|
| thrust::device_vector<T> v(1,0); |
| thrust::device_reference<T> ref = v[0]; |
|
|
| |
| ASSERT_EQUAL(v[0], ref); |
|
|
| |
| ASSERT_EQUAL(&v[0], &ref); |
|
|
| |
| v[0] = 13; |
| ASSERT_EQUAL(13, ref); |
| ASSERT_EQUAL(v[0], ref); |
|
|
| |
| ref = 7; |
| ASSERT_EQUAL(7, v[0]); |
| ASSERT_EQUAL(v[0], ref); |
| } |
| DECLARE_UNITTEST(TestDeviceReferenceConstructorFromDeviceReference); |
|
|
| void TestDeviceReferenceConstructorFromDevicePointer(void) |
| { |
| typedef int T; |
|
|
| thrust::device_vector<T> v(1,0); |
| thrust::device_ptr<T> ptr = &v[0]; |
| thrust::device_reference<T> ref(ptr); |
|
|
| |
| ASSERT_EQUAL(*ptr, ref); |
|
|
| |
| ASSERT_EQUAL(ptr, &ref); |
|
|
| |
| *ptr = 13; |
| ASSERT_EQUAL(13, ref); |
| ASSERT_EQUAL(v[0], ref); |
|
|
| |
| ref = 7; |
| ASSERT_EQUAL(7, *ptr); |
| ASSERT_EQUAL(v[0], ref); |
| } |
| DECLARE_UNITTEST(TestDeviceReferenceConstructorFromDevicePointer); |
|
|
| void TestDeviceReferenceAssignmentFromDeviceReference(void) |
| { |
| |
| typedef int T0; |
| thrust::device_vector<T0> v0(2,0); |
| thrust::device_reference<T0> ref0 = v0[0]; |
| thrust::device_reference<T0> ref1 = v0[1]; |
|
|
| ref0 = 13; |
|
|
| ref1 = ref0; |
|
|
| |
| ASSERT_EQUAL(13, ref1); |
| ASSERT_EQUAL(ref0, ref1); |
|
|
| |
| typedef float T1; |
| thrust::device_vector<T1> v1(1,0.0f); |
| thrust::device_reference<T1> ref2 = v1[0]; |
|
|
| ref2 = ref1; |
|
|
| |
| ASSERT_EQUAL(13.0f, ref2); |
| ASSERT_EQUAL(ref0, ref2); |
| ASSERT_EQUAL(ref1, ref2); |
| } |
| DECLARE_UNITTEST(TestDeviceReferenceAssignmentFromDeviceReference); |
|
|
| void TestDeviceReferenceManipulation(void) |
| { |
| typedef int T1; |
|
|
| thrust::device_vector<T1> v(1,0); |
| thrust::device_ptr<T1> ptr = &v[0]; |
| thrust::device_reference<T1> ref(ptr); |
|
|
| |
| ref = 0; |
|
|
| |
| ++ref; |
| ASSERT_EQUAL(1, ref); |
| ASSERT_EQUAL(1, *ptr); |
| ASSERT_EQUAL(1, v[0]); |
|
|
| |
| ref = 0; |
|
|
| |
| T1 x1 = ref++; |
| ASSERT_EQUAL(0, x1); |
| ASSERT_EQUAL(1, ref); |
| ASSERT_EQUAL(1, *ptr); |
| ASSERT_EQUAL(1, v[0]); |
|
|
| |
| ref = 0; |
|
|
| |
| ref += 5; |
| ASSERT_EQUAL(5, ref); |
| ASSERT_EQUAL(5, *ptr); |
| ASSERT_EQUAL(5, v[0]); |
|
|
| |
| ref = 0; |
|
|
| |
| --ref; |
| ASSERT_EQUAL(-1, ref); |
| ASSERT_EQUAL(-1, *ptr); |
| ASSERT_EQUAL(-1, v[0]); |
|
|
| |
| ref = 0; |
|
|
| |
| ref -= 5; |
| ASSERT_EQUAL(-5, ref); |
| ASSERT_EQUAL(-5, *ptr); |
| ASSERT_EQUAL(-5, v[0]); |
|
|
| |
| ref = 1; |
|
|
| |
| ref *= 5; |
| ASSERT_EQUAL(5, ref); |
| ASSERT_EQUAL(5, *ptr); |
| ASSERT_EQUAL(5, v[0]); |
|
|
| |
| ref = 5; |
|
|
| |
| ref /= 5; |
| ASSERT_EQUAL(1, ref); |
| ASSERT_EQUAL(1, *ptr); |
| ASSERT_EQUAL(1, v[0]); |
|
|
| |
| ref = 5; |
|
|
| |
| ref %= 5; |
| ASSERT_EQUAL(0, ref); |
| ASSERT_EQUAL(0, *ptr); |
| ASSERT_EQUAL(0, v[0]); |
|
|
| |
| ref = 1; |
|
|
| |
| ref <<= 1; |
| ASSERT_EQUAL(2, ref); |
| ASSERT_EQUAL(2, *ptr); |
| ASSERT_EQUAL(2, v[0]); |
|
|
| |
| ref = 2; |
|
|
| |
| ref >>= 1; |
| ASSERT_EQUAL(1, ref); |
| ASSERT_EQUAL(1, *ptr); |
| ASSERT_EQUAL(1, v[0]); |
|
|
| |
| ref = 0; |
|
|
| |
| ref |= 1; |
| ASSERT_EQUAL(1, ref); |
| ASSERT_EQUAL(1, *ptr); |
| ASSERT_EQUAL(1, v[0]); |
| |
| // reset |
| ref = 1; |
| |
| // test XOR-assignment |
| ref ^= 1; |
| ASSERT_EQUAL(0, ref); |
| ASSERT_EQUAL(0, *ptr); |
| ASSERT_EQUAL(0, v[0]); |
| |
| // test equality of const references |
| thrust::device_reference<const T1> ref1 = v[0]; |
| ASSERT_EQUAL(true, ref1 == ref); |
| } |
| DECLARE_UNITTEST(TestDeviceReferenceManipulation); |
| |
| void TestDeviceReferenceSwap(void) |
| { |
| typedef int T; |
| |
| thrust::device_vector<T> v(2); |
| thrust::device_reference<T> ref1 = v.front(); |
| thrust::device_reference<T> ref2 = v.back(); |
| |
| ref1 = 7; |
| ref2 = 13; |
| |
| // test thrust::swap() |
| thrust::swap(ref1, ref2); |
| ASSERT_EQUAL(13, ref1); |
| ASSERT_EQUAL(7, ref2); |
| |
| // test .swap() |
| ref1.swap(ref2); |
| ASSERT_EQUAL(7, ref1); |
| ASSERT_EQUAL(13, ref2); |
| } |
| DECLARE_UNITTEST(TestDeviceReferenceSwap); |
| |
| |