LIVE / thrust /testing /future.cu
Xu Ma
update
1c3c0d9
raw
history blame
6.85 kB
#include <thrust/detail/config.h>
#if THRUST_CPP_DIALECT >= 2011 && !defined(THRUST_LEGACY_GCC)
#include <unittest/unittest.h>
#include <unittest/util_async.h>
#include <thrust/future.h>
struct mock {};
using future_value_types = unittest::type_list<
char
, signed char
, unsigned char
, short
, unsigned short
, int
, unsigned int
, long
, unsigned long
, long long
, unsigned long long
, float
, double
, custom_numeric
, float2
, mock
>;
///////////////////////////////////////////////////////////////////////////////
template <typename T>
struct test_future_default_constructed
{
__host__
void operator()()
{
THRUST_STATIC_ASSERT(
(std::is_same<
thrust::future<decltype(thrust::device), T>
, thrust::unique_eager_future<decltype(thrust::device), T>
>::value)
);
THRUST_STATIC_ASSERT(
(std::is_same<
thrust::future<decltype(thrust::device), T>
, thrust::device_future<T>
>::value)
);
THRUST_STATIC_ASSERT(
(std::is_same<
thrust::device_future<T>
, thrust::device_unique_eager_future<T>
>::value)
);
thrust::device_future<T> f0;
ASSERT_EQUAL(false, f0.valid_stream());
ASSERT_EQUAL(false, f0.valid_content());
ASSERT_THROWS_EQUAL(
f0.wait()
, thrust::event_error
, thrust::event_error(thrust::event_errc::no_state)
);
ASSERT_THROWS_EQUAL(
f0.stream()
, thrust::event_error
, thrust::event_error(thrust::event_errc::no_state)
);
ASSERT_THROWS_EQUAL(
f0.get()
, thrust::event_error
, thrust::event_error(thrust::event_errc::no_content)
);
ASSERT_THROWS_EQUAL(
THRUST_UNUSED_VAR(f0.extract())
, thrust::event_error
, thrust::event_error(thrust::event_errc::no_content)
);
}
};
DECLARE_GENERIC_UNITTEST_WITH_TYPES(
test_future_default_constructed
, future_value_types
);
///////////////////////////////////////////////////////////////////////////////
template <typename T>
struct test_future_new_stream
{
__host__
void operator()()
{
auto f0 = thrust::device_future<T>(thrust::new_stream);
ASSERT_EQUAL(true, f0.valid_stream());
ASSERT_EQUAL(false, f0.valid_content());
ASSERT_NOT_EQUAL_QUIET(nullptr, f0.stream().native_handle());
TEST_EVENT_WAIT(f0);
ASSERT_EQUAL(true, f0.ready());
ASSERT_THROWS_EQUAL(
f0.get()
, thrust::event_error
, thrust::event_error(thrust::event_errc::no_content)
);
ASSERT_THROWS_EQUAL(
THRUST_UNUSED_VAR(f0.extract())
, thrust::event_error
, thrust::event_error(thrust::event_errc::no_content)
);
}
};
DECLARE_GENERIC_UNITTEST_WITH_TYPES(
test_future_new_stream
, future_value_types
);
///////////////////////////////////////////////////////////////////////////////
template <typename T>
struct test_future_convert_to_event
{
__host__
void operator()()
{
auto f0 = thrust::device_future<T>(thrust::new_stream);
auto const f0_stream = f0.stream().native_handle();
ASSERT_EQUAL(true, f0.valid_stream());
ASSERT_EQUAL(false, f0.valid_content());
ASSERT_NOT_EQUAL_QUIET(nullptr, f0_stream);
auto f1 = thrust::device_event(std::move(f0));
ASSERT_EQUAL(false, f0.valid_stream());
ASSERT_EQUAL(true, f1.valid_stream());
ASSERT_EQUAL(f0_stream, f1.stream().native_handle());
}
};
DECLARE_GENERIC_UNITTEST_WITH_TYPES(
test_future_convert_to_event
, future_value_types
);
///////////////////////////////////////////////////////////////////////////////
template <typename T>
struct test_future_when_all
{
__host__
void operator()()
{
// Create futures with new streams.
auto f0 = thrust::device_future<T>(thrust::new_stream);
auto f1 = thrust::device_future<T>(thrust::new_stream);
auto f2 = thrust::device_future<T>(thrust::new_stream);
auto f3 = thrust::device_future<T>(thrust::new_stream);
auto f4 = thrust::device_future<T>(thrust::new_stream);
auto f5 = thrust::device_future<T>(thrust::new_stream);
auto f6 = thrust::device_future<T>(thrust::new_stream);
auto f7 = thrust::device_future<T>(thrust::new_stream);
auto const f0_stream = f0.stream().native_handle();
ASSERT_EQUAL(true, f0.valid_stream());
ASSERT_EQUAL(true, f1.valid_stream());
ASSERT_EQUAL(true, f2.valid_stream());
ASSERT_EQUAL(true, f3.valid_stream());
ASSERT_EQUAL(true, f4.valid_stream());
ASSERT_EQUAL(true, f5.valid_stream());
ASSERT_EQUAL(true, f6.valid_stream());
ASSERT_EQUAL(true, f7.valid_stream());
ASSERT_EQUAL(false, f0.valid_content());
ASSERT_EQUAL(false, f1.valid_content());
ASSERT_EQUAL(false, f2.valid_content());
ASSERT_EQUAL(false, f3.valid_content());
ASSERT_EQUAL(false, f4.valid_content());
ASSERT_EQUAL(false, f5.valid_content());
ASSERT_EQUAL(false, f6.valid_content());
ASSERT_EQUAL(false, f7.valid_content());
ASSERT_NOT_EQUAL_QUIET(nullptr, f0_stream);
ASSERT_NOT_EQUAL_QUIET(nullptr, f1.stream().native_handle());
ASSERT_NOT_EQUAL_QUIET(nullptr, f2.stream().native_handle());
ASSERT_NOT_EQUAL_QUIET(nullptr, f3.stream().native_handle());
ASSERT_NOT_EQUAL_QUIET(nullptr, f4.stream().native_handle());
ASSERT_NOT_EQUAL_QUIET(nullptr, f5.stream().native_handle());
ASSERT_NOT_EQUAL_QUIET(nullptr, f6.stream().native_handle());
ASSERT_NOT_EQUAL_QUIET(nullptr, f7.stream().native_handle());
auto e0 = thrust::when_all(f0, f1, f2, f3, f4, f5, f6, f7);
ASSERT_EQUAL(false, f0.valid_stream());
ASSERT_EQUAL(false, f1.valid_stream());
ASSERT_EQUAL(false, f2.valid_stream());
ASSERT_EQUAL(false, f3.valid_stream());
ASSERT_EQUAL(false, f4.valid_stream());
ASSERT_EQUAL(false, f5.valid_stream());
ASSERT_EQUAL(false, f6.valid_stream());
ASSERT_EQUAL(false, f7.valid_stream());
ASSERT_EQUAL(false, f0.valid_content());
ASSERT_EQUAL(false, f1.valid_content());
ASSERT_EQUAL(false, f2.valid_content());
ASSERT_EQUAL(false, f3.valid_content());
ASSERT_EQUAL(false, f4.valid_content());
ASSERT_EQUAL(false, f5.valid_content());
ASSERT_EQUAL(false, f6.valid_content());
ASSERT_EQUAL(false, f7.valid_content());
ASSERT_EQUAL(true, e0.valid_stream());
ASSERT_EQUAL(f0_stream, e0.stream().native_handle());
TEST_EVENT_WAIT(e0);
ASSERT_EQUAL(false, f0.ready());
ASSERT_EQUAL(false, f1.ready());
ASSERT_EQUAL(false, f2.ready());
ASSERT_EQUAL(false, f3.ready());
ASSERT_EQUAL(false, f4.ready());
ASSERT_EQUAL(false, f5.ready());
ASSERT_EQUAL(false, f6.ready());
ASSERT_EQUAL(false, f7.ready());
ASSERT_EQUAL(true, e0.ready());
}
};
DECLARE_GENERIC_UNITTEST_WITH_TYPES(
test_future_when_all
, future_value_types
);
///////////////////////////////////////////////////////////////////////////////
#endif