Spaces:
Runtime error
Runtime error
| #include <unittest/unittest.h> | |
| #include <thrust/fill.h> | |
| #include <thrust/execution_policy.h> | |
| #include <algorithm> | |
| template<typename ExecutionPolicy, typename Iterator, typename T> | |
| __global__ | |
| void fill_kernel(ExecutionPolicy exec, Iterator first, Iterator last, T value) | |
| { | |
| thrust::fill(exec, first, last, value); | |
| } | |
| template<typename T, typename ExecutionPolicy> | |
| void TestFillDevice(ExecutionPolicy exec, size_t n) | |
| { | |
| thrust::host_vector<T> h_data = unittest::random_integers<T>(n); | |
| thrust::device_vector<T> d_data = h_data; | |
| thrust::fill(h_data.begin() + std::min((size_t)1, n), h_data.begin() + std::min((size_t)3, n), (T) 0); | |
| fill_kernel<<<1,1>>>(exec, d_data.begin() + std::min((size_t)1, n), d_data.begin() + std::min((size_t)3, n), (T) 0); | |
| { | |
| cudaError_t const err = cudaDeviceSynchronize(); | |
| ASSERT_EQUAL(cudaSuccess, err); | |
| } | |
| ASSERT_EQUAL(h_data, d_data); | |
| thrust::fill(h_data.begin() + std::min((size_t)117, n), h_data.begin() + std::min((size_t)367, n), (T) 1); | |
| fill_kernel<<<1,1>>>(exec, d_data.begin() + std::min((size_t)117, n), d_data.begin() + std::min((size_t)367, n), (T) 1); | |
| { | |
| cudaError_t const err = cudaDeviceSynchronize(); | |
| ASSERT_EQUAL(cudaSuccess, err); | |
| } | |
| ASSERT_EQUAL(h_data, d_data); | |
| thrust::fill(h_data.begin() + std::min((size_t)8, n), h_data.begin() + std::min((size_t)259, n), (T) 2); | |
| fill_kernel<<<1,1>>>(exec, d_data.begin() + std::min((size_t)8, n), d_data.begin() + std::min((size_t)259, n), (T) 2); | |
| { | |
| cudaError_t const err = cudaDeviceSynchronize(); | |
| ASSERT_EQUAL(cudaSuccess, err); | |
| } | |
| ASSERT_EQUAL(h_data, d_data); | |
| thrust::fill(h_data.begin() + std::min((size_t)3, n), h_data.end(), (T) 3); | |
| fill_kernel<<<1,1>>>(exec, d_data.begin() + std::min((size_t)3, n), d_data.end(), (T) 3); | |
| { | |
| cudaError_t const err = cudaDeviceSynchronize(); | |
| ASSERT_EQUAL(cudaSuccess, err); | |
| } | |
| ASSERT_EQUAL(h_data, d_data); | |
| thrust::fill(h_data.begin(), h_data.end(), (T) 4); | |
| fill_kernel<<<1,1>>>(exec, d_data.begin(), d_data.end(), (T) 4); | |
| { | |
| cudaError_t const err = cudaDeviceSynchronize(); | |
| ASSERT_EQUAL(cudaSuccess, err); | |
| } | |
| ASSERT_EQUAL(h_data, d_data); | |
| } | |
| template<typename T> | |
| void TestFillDeviceSeq(size_t n) | |
| { | |
| TestFillDevice<T>(thrust::seq, n); | |
| } | |
| DECLARE_VARIABLE_UNITTEST(TestFillDeviceSeq); | |
| template<typename T> | |
| void TestFillDeviceDevice(size_t n) | |
| { | |
| TestFillDevice<T>(thrust::device, n); | |
| } | |
| DECLARE_VARIABLE_UNITTEST(TestFillDeviceDevice); | |
| template<typename ExecutionPolicy, typename Iterator, typename Size, typename T> | |
| __global__ | |
| void fill_n_kernel(ExecutionPolicy exec, Iterator first, Size n, T value) | |
| { | |
| thrust::fill_n(exec, first, n, value); | |
| } | |
| template<typename T, typename ExecutionPolicy> | |
| void TestFillNDevice(ExecutionPolicy exec, size_t n) | |
| { | |
| thrust::host_vector<T> h_data = unittest::random_integers<T>(n); | |
| thrust::device_vector<T> d_data = h_data; | |
| size_t begin_offset = std::min<size_t>(1,n); | |
| thrust::fill_n(h_data.begin() + begin_offset, std::min((size_t)3, n) - begin_offset, (T) 0); | |
| fill_n_kernel<<<1,1>>>(exec, d_data.begin() + begin_offset, std::min((size_t)3, n) - begin_offset, (T) 0); | |
| { | |
| cudaError_t const err = cudaDeviceSynchronize(); | |
| ASSERT_EQUAL(cudaSuccess, err); | |
| } | |
| ASSERT_EQUAL(h_data, d_data); | |
| begin_offset = std::min<size_t>(117, n); | |
| thrust::fill_n(h_data.begin() + begin_offset, std::min((size_t)367, n) - begin_offset, (T) 1); | |
| fill_n_kernel<<<1,1>>>(exec, d_data.begin() + begin_offset, std::min((size_t)367, n) - begin_offset, (T) 1); | |
| { | |
| cudaError_t const err = cudaDeviceSynchronize(); | |
| ASSERT_EQUAL(cudaSuccess, err); | |
| } | |
| ASSERT_EQUAL(h_data, d_data); | |
| begin_offset = std::min<size_t>(8, n); | |
| thrust::fill_n(h_data.begin() + begin_offset, std::min((size_t)259, n) - begin_offset, (T) 2); | |
| fill_n_kernel<<<1,1>>>(exec, d_data.begin() + begin_offset, std::min((size_t)259, n) - begin_offset, (T) 2); | |
| { | |
| cudaError_t const err = cudaDeviceSynchronize(); | |
| ASSERT_EQUAL(cudaSuccess, err); | |
| } | |
| ASSERT_EQUAL(h_data, d_data); | |
| begin_offset = std::min<size_t>(3, n); | |
| thrust::fill_n(h_data.begin() + begin_offset, h_data.size() - begin_offset, (T) 3); | |
| fill_n_kernel<<<1,1>>>(exec, d_data.begin() + begin_offset, d_data.size() - begin_offset, (T) 3); | |
| { | |
| cudaError_t const err = cudaDeviceSynchronize(); | |
| ASSERT_EQUAL(cudaSuccess, err); | |
| } | |
| ASSERT_EQUAL(h_data, d_data); | |
| thrust::fill_n(h_data.begin(), h_data.size(), (T) 4); | |
| fill_n_kernel<<<1,1>>>(exec, d_data.begin(), d_data.size(), (T) 4); | |
| { | |
| cudaError_t const err = cudaDeviceSynchronize(); | |
| ASSERT_EQUAL(cudaSuccess, err); | |
| } | |
| ASSERT_EQUAL(h_data, d_data); | |
| } | |
| template<typename T> | |
| void TestFillNDeviceSeq(size_t n) | |
| { | |
| TestFillNDevice<T>(thrust::seq, n); | |
| } | |
| DECLARE_VARIABLE_UNITTEST(TestFillNDeviceSeq); | |
| template<typename T> | |
| void TestFillNDeviceDevice(size_t n) | |
| { | |
| TestFillNDevice<T>(thrust::device, n); | |
| } | |
| DECLARE_VARIABLE_UNITTEST(TestFillNDeviceDevice); | |
| void TestFillCudaStreams() | |
| { | |
| thrust::device_vector<int> v(5); | |
| v[0] = 0; v[1] = 1; v[2] = 2; v[3] = 3; v[4] = 4; | |
| cudaStream_t s; | |
| cudaStreamCreate(&s); | |
| thrust::fill(thrust::cuda::par.on(s), v.begin() + 1, v.begin() + 4, 7); | |
| cudaStreamSynchronize(s); | |
| ASSERT_EQUAL(v[0], 0); | |
| ASSERT_EQUAL(v[1], 7); | |
| ASSERT_EQUAL(v[2], 7); | |
| ASSERT_EQUAL(v[3], 7); | |
| ASSERT_EQUAL(v[4], 4); | |
| thrust::fill(thrust::cuda::par.on(s), v.begin() + 0, v.begin() + 3, 8); | |
| cudaStreamSynchronize(s); | |
| ASSERT_EQUAL(v[0], 8); | |
| ASSERT_EQUAL(v[1], 8); | |
| ASSERT_EQUAL(v[2], 8); | |
| ASSERT_EQUAL(v[3], 7); | |
| ASSERT_EQUAL(v[4], 4); | |
| thrust::fill(thrust::cuda::par.on(s), v.begin() + 2, v.end(), 9); | |
| cudaStreamSynchronize(s); | |
| ASSERT_EQUAL(v[0], 8); | |
| ASSERT_EQUAL(v[1], 8); | |
| ASSERT_EQUAL(v[2], 9); | |
| ASSERT_EQUAL(v[3], 9); | |
| ASSERT_EQUAL(v[4], 9); | |
| thrust::fill(thrust::cuda::par.on(s), v.begin(), v.end(), 1); | |
| cudaStreamSynchronize(s); | |
| ASSERT_EQUAL(v[0], 1); | |
| ASSERT_EQUAL(v[1], 1); | |
| ASSERT_EQUAL(v[2], 1); | |
| ASSERT_EQUAL(v[3], 1); | |
| ASSERT_EQUAL(v[4], 1); | |
| cudaStreamDestroy(s); | |
| } | |
| DECLARE_UNITTEST(TestFillCudaStreams); | |