|
#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); |
|
|
|
|