Fix empty subspan. (#4151)

* Silent the death tests.
This commit is contained in:
Jiaming Yuan 2019-02-17 04:48:03 +08:00 committed by GitHub
parent ff2d4c99fa
commit 1fe874e58a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 9 deletions

View File

@ -69,6 +69,7 @@ namespace common {
// Usual logging facility is not available inside device code. // Usual logging facility is not available inside device code.
// TODO(trivialfis): Make dmlc check more generic. // TODO(trivialfis): Make dmlc check more generic.
// assert is not supported in mac as of CUDA 10.0
#define KERNEL_CHECK(cond) \ #define KERNEL_CHECK(cond) \
do { \ do { \
if (!(cond)) { \ if (!(cond)) { \
@ -543,7 +544,7 @@ class Span {
XGBOOST_DEVICE auto subspan() const -> // NOLINT XGBOOST_DEVICE auto subspan() const -> // NOLINT
Span<element_type, Span<element_type,
detail::ExtentValue<Extent, Offset, Count>::value> { detail::ExtentValue<Extent, Offset, Count>::value> {
SPAN_CHECK(Offset >= 0 && Offset < size()); SPAN_CHECK(Offset >= 0 && (Offset < size() || size() == 0));
SPAN_CHECK(Count == dynamic_extent || SPAN_CHECK(Count == dynamic_extent ||
Count >= 0 && Offset + Count <= size()); Count >= 0 && Offset + Count <= size());
@ -553,7 +554,7 @@ class Span {
XGBOOST_DEVICE Span<element_type, dynamic_extent> subspan( // NOLINT XGBOOST_DEVICE Span<element_type, dynamic_extent> subspan( // NOLINT
detail::ptrdiff_t _offset, detail::ptrdiff_t _offset,
detail::ptrdiff_t _count = dynamic_extent) const { detail::ptrdiff_t _count = dynamic_extent) const {
SPAN_CHECK(_offset >= 0 && _offset < size()); SPAN_CHECK(_offset >= 0 && (_offset < size() || size() == 0));
SPAN_CHECK((_count == dynamic_extent) || SPAN_CHECK((_count == dynamic_extent) ||
(_count >= 0 && _offset + _count <= size())); (_count >= 0 && _offset + _count <= size()));

View File

@ -419,5 +419,29 @@ TEST(Span, AsWritableBytes) {
ASSERT_EQ(status, 1); ASSERT_EQ(status, 1);
} }
TEST(Span, Empty) {
{
Span<float> s {nullptr, static_cast<Span<float>::index_type>(0)};
auto res = s.subspan(0);
ASSERT_EQ(res.data(), nullptr);
ASSERT_EQ(res.size(), 0);
res = s.subspan(0, 0);
ASSERT_EQ(res.data(), nullptr);
ASSERT_EQ(res.size(), 0);
}
{
Span<float, 0> s {nullptr, static_cast<Span<float>::index_type>(0)};
auto res = s.subspan(0);
ASSERT_EQ(res.data(), nullptr);
ASSERT_EQ(res.size(), 0);
res = s.subspan(0, 0);
ASSERT_EQ(res.data(), nullptr);
ASSERT_EQ(res.size(), 0);
}
}
} // namespace common } // namespace common
} // namespace xgboost } // namespace xgboost

View File

@ -216,15 +216,20 @@ struct TestElementAccess {
TEST(GPUSpan, ElementAccess) { TEST(GPUSpan, ElementAccess) {
dh::safe_cuda(cudaSetDevice(0)); dh::safe_cuda(cudaSetDevice(0));
EXPECT_DEATH({ auto test_element_access = []() {
thrust::host_vector<float> h_vec (16); thrust::host_vector<float> h_vec (16);
InitializeRange(h_vec.begin(), h_vec.end()); InitializeRange(h_vec.begin(), h_vec.end());
thrust::device_vector<float> d_vec (h_vec.size()); thrust::device_vector<float> d_vec (h_vec.size());
thrust::copy(h_vec.begin(), h_vec.end(), d_vec.begin()); thrust::copy(h_vec.begin(), h_vec.end(), d_vec.begin());
Span<float> span (d_vec.data().get(), d_vec.size()); Span<float> span (d_vec.data().get(), d_vec.size());
dh::LaunchN(0, 17, TestElementAccess{span});}, ""); dh::LaunchN(0, 17, TestElementAccess{span});
};
testing::internal::CaptureStdout();
EXPECT_DEATH(test_element_access(), "");
std::string output = testing::internal::GetCapturedStdout();
} }
__global__ void test_first_dynamic_kernel(Span<float> _span) { __global__ void test_first_dynamic_kernel(Span<float> _span) {
@ -253,7 +258,9 @@ TEST(GPUSpan, FirstLast) {
Span<float> span (d_vec.data().get(), d_vec.size()); Span<float> span (d_vec.data().get(), d_vec.size());
test_first_dynamic_kernel<<<1, 1>>>(span); test_first_dynamic_kernel<<<1, 1>>>(span);
}; };
testing::internal::CaptureStdout();
EXPECT_DEATH(lambda_first_dy(), ""); EXPECT_DEATH(lambda_first_dy(), "");
std::string output = testing::internal::GetCapturedStdout();
auto lambda_first_static = []() { auto lambda_first_static = []() {
thrust::host_vector<float> h_vec (4); thrust::host_vector<float> h_vec (4);
@ -265,7 +272,9 @@ TEST(GPUSpan, FirstLast) {
Span<float> span (d_vec.data().get(), d_vec.size()); Span<float> span (d_vec.data().get(), d_vec.size());
test_first_static_kernel<<<1, 1>>>(span); test_first_static_kernel<<<1, 1>>>(span);
}; };
testing::internal::CaptureStdout();
EXPECT_DEATH(lambda_first_static(), ""); EXPECT_DEATH(lambda_first_static(), "");
output = testing::internal::GetCapturedStdout();
auto lambda_last_dy = []() { auto lambda_last_dy = []() {
thrust::host_vector<float> h_vec (4); thrust::host_vector<float> h_vec (4);
@ -277,7 +286,9 @@ TEST(GPUSpan, FirstLast) {
Span<float> span (d_vec.data().get(), d_vec.size()); Span<float> span (d_vec.data().get(), d_vec.size());
test_last_dynamic_kernel<<<1, 1>>>(span); test_last_dynamic_kernel<<<1, 1>>>(span);
}; };
testing::internal::CaptureStdout();
EXPECT_DEATH(lambda_last_dy(), ""); EXPECT_DEATH(lambda_last_dy(), "");
output = testing::internal::GetCapturedStdout();
auto lambda_last_static = []() { auto lambda_last_static = []() {
thrust::host_vector<float> h_vec (4); thrust::host_vector<float> h_vec (4);
@ -289,7 +300,9 @@ TEST(GPUSpan, FirstLast) {
Span<float> span (d_vec.data().get(), d_vec.size()); Span<float> span (d_vec.data().get(), d_vec.size());
test_last_static_kernel<<<1, 1>>>(span); test_last_static_kernel<<<1, 1>>>(span);
}; };
testing::internal::CaptureStdout();
EXPECT_DEATH(lambda_last_static(), ""); EXPECT_DEATH(lambda_last_static(), "");
output = testing::internal::GetCapturedStdout();
} }
@ -310,7 +323,9 @@ TEST(GPUSpan, Subspan) {
Span<float> span (d_vec.data().get(), d_vec.size()); Span<float> span (d_vec.data().get(), d_vec.size());
test_subspan_dynamic_kernel<<<1, 1>>>(span); test_subspan_dynamic_kernel<<<1, 1>>>(span);
}; };
testing::internal::CaptureStdout();
EXPECT_DEATH(lambda_subspan_dynamic(), ""); EXPECT_DEATH(lambda_subspan_dynamic(), "");
std::string output = testing::internal::GetCapturedStdout();
auto lambda_subspan_static = []() { auto lambda_subspan_static = []() {
thrust::host_vector<float> h_vec (4); thrust::host_vector<float> h_vec (4);
@ -322,7 +337,9 @@ TEST(GPUSpan, Subspan) {
Span<float> span (d_vec.data().get(), d_vec.size()); Span<float> span (d_vec.data().get(), d_vec.size());
test_subspan_static_kernel<<<1, 1>>>(span); test_subspan_static_kernel<<<1, 1>>>(span);
}; };
testing::internal::CaptureStdout();
EXPECT_DEATH(lambda_subspan_static(), ""); EXPECT_DEATH(lambda_subspan_static(), "");
output = testing::internal::GetCapturedStdout();
} }
TEST(GPUSpanIter, Construct) { TEST(GPUSpanIter, Construct) {