/** * Copyright 2018-2023 by XGBoost Contributors */ #include #include #include #include #include #include "../../../src/common/transform.h" #include "../helpers.h" namespace xgboost::common { namespace { constexpr DeviceOrd TransformDevice() { #if defined(__CUDACC__) || defined(__HIPCC__) return DeviceOrd::CUDA(0); #else return DeviceOrd::CPU(); #endif } } // namespace template struct TestTransformRange { void XGBOOST_DEVICE operator()(std::size_t _idx, Span _out, Span _in) { _out[_idx] = _in[_idx]; } }; TEST(Transform, DeclareUnifiedTest(Basic)) { const size_t size{256}; std::vector h_in(size); std::vector h_out(size); std::iota(h_in.begin(), h_in.end(), 0); std::vector h_sol(size); std::iota(h_sol.begin(), h_sol.end(), 0); auto device = TransformDevice(); HostDeviceVector const in_vec{h_in, device}; HostDeviceVector out_vec{h_out, device}; out_vec.Fill(0); Transform<>::Init(TestTransformRange{}, Range{0, static_cast(size)}, AllThreadsForTest(), TransformDevice()) .Eval(&out_vec, &in_vec); std::vector res = out_vec.HostVector(); ASSERT_TRUE(std::equal(h_sol.begin(), h_sol.end(), res.begin())); } #if !defined(__CUDACC__) && !defined(__HIPCC__) TEST(TransformDeathTest, Exception) { size_t const kSize{16}; std::vector h_in(kSize); const HostDeviceVector in_vec{h_in, DeviceOrd::CPU()}; EXPECT_DEATH( { Transform<>::Init([](size_t idx, common::Span _in) { _in[idx + 1]; }, Range(0, static_cast(kSize)), AllThreadsForTest(), DeviceOrd::CPU()) .Eval(&in_vec); }, ""); } #endif } // namespace xgboost::common