Spaces:
Runtime error
Runtime error
#include <thrust/detail/config.h> | |
#if THRUST_CPP_DIALECT >= 2014 | |
#include <unittest/unittest.h> | |
#include <thrust/async/for_each.h> | |
#include <thrust/host_vector.h> | |
#include <thrust/device_vector.h> | |
#define DEFINE_ASYNC_FOR_EACH_CALLABLE(name, ...) \ | |
struct THRUST_PP_CAT2(name, _fn) \ | |
{ \ | |
template <typename ForwardIt, typename Sentinel, typename UnaryFunction> \ | |
__host__ \ | |
auto operator()( \ | |
ForwardIt&& first, Sentinel&& last, UnaryFunction&& f \ | |
) const \ | |
THRUST_RETURNS( \ | |
::thrust::async::for_each( \ | |
__VA_ARGS__ \ | |
THRUST_PP_COMMA_IF(THRUST_PP_ARITY(__VA_ARGS__)) \ | |
THRUST_FWD(first), THRUST_FWD(last), THRUST_FWD(f) \ | |
) \ | |
) \ | |
}; \ | |
/**/ | |
DEFINE_ASYNC_FOR_EACH_CALLABLE( | |
invoke_async_for_each | |
); | |
DEFINE_ASYNC_FOR_EACH_CALLABLE( | |
invoke_async_for_each_device, thrust::device | |
); | |
#undef DEFINE_ASYNC_FOR_EACH_CALLABLE | |
/////////////////////////////////////////////////////////////////////////////// | |
struct inplace_divide_by_2 | |
{ | |
template <typename T> | |
__host__ __device__ | |
void operator()(T& x) const | |
{ | |
x /= 2; | |
} | |
}; | |
/////////////////////////////////////////////////////////////////////////////// | |
template <typename AsyncForEachCallable, typename UnaryFunction> | |
struct test_async_for_each | |
{ | |
template <typename T> | |
struct tester | |
{ | |
__host__ | |
void operator()(std::size_t n) | |
{ | |
thrust::host_vector<T> h0_data(unittest::random_integers<T>(n)); | |
thrust::device_vector<T> d0_data(h0_data); | |
thrust::for_each(h0_data.begin(), h0_data.end(), UnaryFunction{}); | |
auto f0 = AsyncForEachCallable{}( | |
d0_data.begin(), d0_data.end(), UnaryFunction{} | |
); | |
f0.wait(); | |
ASSERT_EQUAL(h0_data, d0_data); | |
} | |
}; | |
}; | |
DECLARE_GENERIC_SIZED_UNITTEST_WITH_TYPES_AND_NAME( | |
THRUST_PP_EXPAND_ARGS( | |
test_async_for_each< | |
invoke_async_for_each_fn | |
, inplace_divide_by_2 | |
>::tester | |
) | |
, NumericTypes | |
, test_async_for_each | |
); | |
DECLARE_GENERIC_SIZED_UNITTEST_WITH_TYPES_AND_NAME( | |
THRUST_PP_EXPAND_ARGS( | |
test_async_for_each< | |
invoke_async_for_each_device_fn | |
, inplace_divide_by_2 | |
>::tester | |
) | |
, NumericTypes | |
, test_async_for_each_policy | |
); | |
#endif | |