File indexing completed on 2026-05-27 07:24:24
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "mask_store_cuda_kernel.hpp"
0011
0012
0013 #include <vecmem/memory/cuda/managed_memory_resource.hpp>
0014
0015
0016 #include <gtest/gtest.h>
0017
0018
0019 #include <climits>
0020 #include <cstdlib>
0021 #include <random>
0022
0023 using namespace detray;
0024
0025 TEST(mask_store_cuda, mask_store) {
0026
0027 vecmem::cuda::managed_memory_resource mng_mr;
0028
0029
0030 host_store_type store(mng_mr);
0031
0032 ASSERT_TRUE(store.template empty<mask_id::e_annulus2D>());
0033 ASSERT_TRUE(store.template empty<mask_id::e_cylinder2D>());
0034 ASSERT_TRUE(store.template empty<mask_id::e_rectangle2D>());
0035 ASSERT_TRUE(store.template empty<mask_id::e_ring2D>());
0036 ASSERT_TRUE(store.template empty<mask_id::e_single3D>());
0037 ASSERT_TRUE(store.template empty<mask_id::e_trapezoid2D>());
0038
0039 store.template emplace_back<mask_id::e_rectangle2D>(empty_context{}, 0u, 1.0f,
0040 2.0f);
0041 store.template emplace_back<mask_id::e_trapezoid2D>(empty_context{}, 0u, 0.5f,
0042 1.5f, 4.0f, 1.f / 8.f);
0043 store.template emplace_back<mask_id::e_ring2D>(empty_context{}, 0u, 1.0f,
0044 10.0f);
0045 store.template emplace_back<mask_id::e_cylinder2D>(empty_context{}, 0u, 1.f,
0046 0.5f, 2.0f);
0047 store.template emplace_back<mask_id::e_annulus2D>(
0048 empty_context{}, 0u, 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f);
0049
0050 ASSERT_FALSE(store.empty<mask_id::e_annulus2D>());
0051 ASSERT_FALSE(store.empty<mask_id::e_cylinder2D>());
0052 ASSERT_FALSE(store.empty<mask_id::e_rectangle2D>());
0053 ASSERT_FALSE(store.empty<mask_id::e_ring2D>());
0054 ASSERT_TRUE(store.empty<mask_id::e_single3D>());
0055 ASSERT_FALSE(store.empty<mask_id::e_trapezoid2D>());
0056
0057
0058 vecmem::vector<point3> input_point3(n_points, &mng_mr);
0059
0060 std::random_device rd;
0061 std::mt19937_64 gen(rd());
0062 std::uniform_real_distribution<dscalar<test_algebra>> dist(0.f, 9.9f);
0063 for (unsigned int i = 0u; i < n_points; i++) {
0064 point3 rand_point3 = {dist(gen), dist(gen), dist(gen)};
0065 input_point3[i] = rand_point3;
0066 }
0067
0068
0069 vecmem::jagged_vector<int> output_host(5, &mng_mr);
0070
0071
0072 const auto& rectangle_mask = store.get<mask_id::e_rectangle2D>()[0];
0073 const auto& trapezoid_mask = store.get<mask_id::e_trapezoid2D>()[0];
0074 const auto& ring_mask = store.get<mask_id::e_ring2D>()[0];
0075 const auto& cylinder_mask = store.get<mask_id::e_cylinder2D>()[0];
0076 const auto& annulus_mask = store.get<mask_id::e_annulus2D>()[0];
0077
0078
0079 for (unsigned int i = 0u; i < n_points; i++) {
0080 output_host[0].push_back(rectangle_mask.is_inside(input_point3[i]));
0081 output_host[1].push_back(trapezoid_mask.is_inside(input_point3[i]));
0082 output_host[2].push_back(ring_mask.is_inside(input_point3[i]));
0083 output_host[3].push_back(cylinder_mask.is_inside(input_point3[i]));
0084 output_host[4].push_back(annulus_mask.is_inside(input_point3[i]));
0085 }
0086
0087
0088 vecmem::cuda::copy copy;
0089
0090
0091 vecmem::data::jagged_vector_buffer<int> output_buffer(
0092 {n_points, n_points, n_points, n_points, n_points}, mng_mr, nullptr,
0093 vecmem::data::buffer_type::resizable);
0094
0095 copy.setup(output_buffer)->wait();
0096
0097 auto input_point3_data = vecmem::get_data(input_point3);
0098 auto store_data = get_data(store);
0099
0100
0101 mask_test(store_data, input_point3_data, output_buffer);
0102
0103 vecmem::jagged_vector<int> output_device(&mng_mr);
0104 copy(output_buffer, output_device)->wait();
0105
0106
0107 for (unsigned int i = 0u; i < n_points; i++) {
0108 ASSERT_EQ(output_host[0][i], output_device[0][i]);
0109 ASSERT_EQ(output_host[0][i], output_device[0][i]);
0110 ASSERT_EQ(output_host[2][i], output_device[2][i]);
0111 ASSERT_EQ(output_host[3][i], output_device[3][i]);
0112 ASSERT_EQ(output_host[4][i], output_device[4][i]);
0113 }
0114 }