LIVE / thrust /testing /device_reference.cu
Xu Ma
update
1c3c0d9
raw
history blame
4.71 kB
#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);