Spaces:
Runtime error
Runtime error
#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]; | |
// ref equals the object at v[0] | |
ASSERT_EQUAL(v[0], ref); | |
// the address of ref equals the address of v[0] | |
ASSERT_EQUAL(&v[0], &ref); | |
// modifying v[0] modifies ref | |
v[0] = 13; | |
ASSERT_EQUAL(13, ref); | |
ASSERT_EQUAL(v[0], ref); | |
// modifying ref modifies v[0] | |
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); | |
// ref equals the object pointed to by ptr | |
ASSERT_EQUAL(*ptr, ref); | |
// the address of ref equals ptr | |
ASSERT_EQUAL(ptr, &ref); | |
// modifying *ptr modifies ref | |
*ptr = 13; | |
ASSERT_EQUAL(13, ref); | |
ASSERT_EQUAL(v[0], ref); | |
// modifying ref modifies *ptr | |
ref = 7; | |
ASSERT_EQUAL(7, *ptr); | |
ASSERT_EQUAL(v[0], ref); | |
} | |
DECLARE_UNITTEST(TestDeviceReferenceConstructorFromDevicePointer); | |
void TestDeviceReferenceAssignmentFromDeviceReference(void) | |
{ | |
// test same types | |
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; | |
// ref1 equals 13 | |
ASSERT_EQUAL(13, ref1); | |
ASSERT_EQUAL(ref0, ref1); | |
// test different types | |
typedef float T1; | |
thrust::device_vector<T1> v1(1,0.0f); | |
thrust::device_reference<T1> ref2 = v1[0]; | |
ref2 = ref1; | |
// ref2 equals 13.0f | |
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); | |
// reset | |
ref = 0; | |
// test prefix increment | |
++ref; | |
ASSERT_EQUAL(1, ref); | |
ASSERT_EQUAL(1, *ptr); | |
ASSERT_EQUAL(1, v[0]); | |
// reset | |
ref = 0; | |
// test postfix increment | |
T1 x1 = ref++; | |
ASSERT_EQUAL(0, x1); | |
ASSERT_EQUAL(1, ref); | |
ASSERT_EQUAL(1, *ptr); | |
ASSERT_EQUAL(1, v[0]); | |
// reset | |
ref = 0; | |
// test addition-assignment | |
ref += 5; | |
ASSERT_EQUAL(5, ref); | |
ASSERT_EQUAL(5, *ptr); | |
ASSERT_EQUAL(5, v[0]); | |
// reset | |
ref = 0; | |
// test prefix decrement | |
--ref; | |
ASSERT_EQUAL(-1, ref); | |
ASSERT_EQUAL(-1, *ptr); | |
ASSERT_EQUAL(-1, v[0]); | |
// reset | |
ref = 0; | |
// test subtraction-assignment | |
ref -= 5; | |
ASSERT_EQUAL(-5, ref); | |
ASSERT_EQUAL(-5, *ptr); | |
ASSERT_EQUAL(-5, v[0]); | |
// reset | |
ref = 1; | |
// test multiply-assignment | |
ref *= 5; | |
ASSERT_EQUAL(5, ref); | |
ASSERT_EQUAL(5, *ptr); | |
ASSERT_EQUAL(5, v[0]); | |
// reset | |
ref = 5; | |
// test divide-assignment | |
ref /= 5; | |
ASSERT_EQUAL(1, ref); | |
ASSERT_EQUAL(1, *ptr); | |
ASSERT_EQUAL(1, v[0]); | |
// reset | |
ref = 5; | |
// test modulus-assignment | |
ref %= 5; | |
ASSERT_EQUAL(0, ref); | |
ASSERT_EQUAL(0, *ptr); | |
ASSERT_EQUAL(0, v[0]); | |
// reset | |
ref = 1; | |
// test left shift-assignment | |
ref <<= 1; | |
ASSERT_EQUAL(2, ref); | |
ASSERT_EQUAL(2, *ptr); | |
ASSERT_EQUAL(2, v[0]); | |
// reset | |
ref = 2; | |
// test right shift-assignment | |
ref >>= 1; | |
ASSERT_EQUAL(1, ref); | |
ASSERT_EQUAL(1, *ptr); | |
ASSERT_EQUAL(1, v[0]); | |
// reset | |
ref = 0; | |
// test OR-assignment | |
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); | |