File indexing completed on 2026-05-27 07:24:25
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "utils_ranges_cuda_kernel.hpp"
0011
0012
0013 #include <vecmem/memory/cuda/managed_memory_resource.hpp>
0014 #include <vecmem/utils/cuda/copy.hpp>
0015
0016
0017 #include <gtest/gtest.h>
0018
0019 using namespace detray;
0020
0021
0022 TEST(utils_ranges_cuda, single) {
0023 dindex value{251u};
0024 dindex check{std::numeric_limits<dindex>::max()};
0025
0026
0027 test_single(value, check);
0028
0029
0030 ASSERT_EQ(value, check);
0031 }
0032
0033
0034 TEST(utils_ranges_cuda, pointer) {
0035 dindex value{251u};
0036 dindex check{std::numeric_limits<dindex>::max()};
0037
0038
0039 test_pointer(value, check);
0040
0041
0042 ASSERT_EQ(value, check);
0043 }
0044
0045
0046 TEST(utils_ranges_cuda, iota) {
0047
0048 vecmem::cuda::copy copy;
0049
0050
0051 vecmem::cuda::managed_memory_resource managed_resource;
0052
0053
0054 vecmem::vector<dindex> reference({2u, 3u, 4u, 5u, 6u});
0055
0056
0057 const darray<dindex, 2> range = {2u, 7u};
0058
0059
0060 vecmem::data::vector_buffer<dindex> check_buffer(
0061 static_cast<vecmem::data::vector_buffer<dindex>::size_type>(range[1] -
0062 range[0]),
0063 managed_resource, vecmem::data::buffer_type::resizable);
0064 copy.setup(check_buffer)->wait();
0065
0066
0067 test_iota(range, check_buffer);
0068
0069
0070 vecmem::vector<dindex> check{&managed_resource};
0071 copy(check_buffer, check)->wait();
0072
0073
0074 ASSERT_EQ(check, reference);
0075 }
0076
0077
0078 TEST(utils_ranges_cuda, cartesian_product) {
0079
0080 vecmem::cuda::copy copy;
0081
0082
0083 vecmem::cuda::managed_memory_resource managed_resource;
0084
0085
0086 const darray<dindex, 2> range1 = {2u, 7u};
0087 const darray<dindex, 2> range2 = {1u, 10u};
0088 const darray<dindex, 2> range3 = {3u, 4u};
0089
0090 auto seq1 = detray::views::iota(range1);
0091 auto seq2 = detray::views::iota(range2);
0092 auto seq3 = detray::views::iota(range3);
0093
0094 dindex size{seq1.size() * seq2.size() * seq3.size()};
0095
0096
0097 vecmem::vector<std::tuple<dindex, dindex, dindex>> result;
0098 for (auto i : seq1) {
0099 for (auto j : seq2) {
0100 for (auto k : seq3) {
0101 result.emplace_back(i, j, k);
0102 }
0103 }
0104 }
0105
0106
0107 using buffer_t =
0108 vecmem::data::vector_buffer<std::tuple<dindex, dindex, dindex>>;
0109 buffer_t check_buffer(static_cast<buffer_t::size_type>(size),
0110 managed_resource, vecmem::data::buffer_type::resizable);
0111 copy.setup(check_buffer)->wait();
0112
0113
0114 test_cartesian_product(range1, range2, range3, check_buffer);
0115
0116
0117 vecmem::vector<std::tuple<dindex, dindex, dindex>> check{&managed_resource};
0118 copy(check_buffer, check)->wait();
0119
0120
0121 ASSERT_EQ(result.size(), check.size());
0122
0123 for (std::size_t r = 0; r < check.size(); ++r) {
0124 const auto [i, j, k] = check[r];
0125 const auto [l, m, n] = result[r];
0126
0127 ASSERT_EQ(i, l);
0128 ASSERT_EQ(j, m);
0129 ASSERT_EQ(k, n);
0130 }
0131 }
0132
0133
0134 TEST(utils_ranges_cuda, enumerate) {
0135
0136 vecmem::cuda::copy copy;
0137
0138
0139 vecmem::cuda::managed_memory_resource managed_resource;
0140
0141
0142 vecmem::vector<uint_holder> seq({{0u}, {1u}, {2u}, {3u}, {4u}, {5u}},
0143 &managed_resource);
0144
0145
0146 auto seq_data = vecmem::get_data(seq);
0147
0148
0149 vecmem::data::vector_buffer<dindex> idx_buffer(
0150 static_cast<vecmem::data::vector_buffer<dindex>::size_type>(seq.size()),
0151 managed_resource, vecmem::data::buffer_type::resizable);
0152 copy.setup(idx_buffer)->wait();
0153
0154 vecmem::data::vector_buffer<dindex> value_buffer(
0155 static_cast<vecmem::data::vector_buffer<dindex>::size_type>(seq.size()),
0156 managed_resource, vecmem::data::buffer_type::resizable);
0157 copy.setup(value_buffer)->wait();
0158
0159
0160 test_enumerate(seq_data, idx_buffer, value_buffer);
0161
0162
0163 vecmem::vector<dindex> idx_vec{&managed_resource};
0164 copy(idx_buffer, idx_vec)->wait();
0165
0166 vecmem::vector<dindex> value_vec{&managed_resource};
0167 copy(value_buffer, value_vec)->wait();
0168
0169
0170 for (std::size_t i = 0u; i < idx_vec.size(); i++) {
0171 ASSERT_EQ(idx_vec[i], value_vec[i]);
0172 }
0173 }
0174
0175
0176 TEST(utils_ranges_cuda, pick) {
0177
0178 vecmem::cuda::copy copy;
0179
0180
0181 vecmem::cuda::managed_memory_resource managed_resource;
0182
0183
0184 vecmem::vector<uint_holder> seq({{0u}, {1u}, {2u}, {3u}, {4u}, {5u}},
0185 &managed_resource);
0186
0187 vecmem::vector<dindex> idx({0u, 2u, 4u, 5u}, &managed_resource);
0188
0189
0190 auto seq_data = vecmem::get_data(seq);
0191 auto idx_data = vecmem::get_data(idx);
0192
0193
0194 vecmem::data::vector_buffer<dindex> idx_buffer(
0195 static_cast<vecmem::data::vector_buffer<dindex>::size_type>(seq.size()),
0196 managed_resource, vecmem::data::buffer_type::resizable);
0197 copy.setup(idx_buffer)->wait();
0198
0199 vecmem::data::vector_buffer<dindex> value_buffer(
0200 static_cast<vecmem::data::vector_buffer<dindex>::size_type>(seq.size()),
0201 managed_resource, vecmem::data::buffer_type::resizable);
0202 copy.setup(value_buffer)->wait();
0203
0204
0205 test_pick(seq_data, idx_data, idx_buffer, value_buffer);
0206
0207
0208 vecmem::vector<dindex> idx_vec{&managed_resource};
0209 copy(idx_buffer, idx_vec)->wait();
0210
0211 vecmem::vector<dindex> value_vec{&managed_resource};
0212 copy(value_buffer, value_vec)->wait();
0213
0214
0215 for (std::size_t i = 0u; i < idx_vec.size(); i++) {
0216 ASSERT_EQ(idx[i], idx_vec[i]);
0217 ASSERT_EQ(seq[idx_vec[i]].ui, value_vec[i]);
0218 }
0219 }
0220
0221
0222 TEST(utils_ranges_cuda, join) {
0223
0224 vecmem::cuda::copy copy;
0225
0226
0227 vecmem::cuda::managed_memory_resource managed_resource;
0228
0229
0230 vecmem::vector<uint_holder> seq_1({{0u}, {1u}, {2u}, {3u}, {4u}, {5u}},
0231 &managed_resource);
0232 vecmem::vector<uint_holder> seq_2({{2u}, {0u}, {9u}, {4u}, {15u}},
0233 &managed_resource);
0234
0235 auto seq_data_1 = vecmem::get_data(seq_1);
0236 auto seq_data_2 = vecmem::get_data(seq_2);
0237
0238
0239 vecmem::data::vector_buffer<dindex> value_buffer(
0240 static_cast<vecmem::data::vector_buffer<dindex>::size_type>(seq_1.size() +
0241 seq_2.size()),
0242 managed_resource, vecmem::data::buffer_type::resizable);
0243 copy.setup(value_buffer)->wait();
0244
0245
0246 test_join(seq_data_1, seq_data_2, value_buffer);
0247
0248
0249 vecmem::vector<dindex> value_vec{&managed_resource};
0250 copy(value_buffer, value_vec)->wait();
0251
0252
0253 for (std::size_t i = 0u; i < seq_1.size(); i++) {
0254 ASSERT_EQ(seq_1[i].ui, value_vec[i]);
0255 }
0256
0257 for (std::size_t i = 0u; i < seq_2.size(); i++) {
0258 ASSERT_EQ(seq_2[i].ui, value_vec[i + seq_1.size()]);
0259 }
0260 }
0261
0262
0263 TEST(utils_ranges_cuda, static_join) {
0264
0265 vecmem::cuda::copy copy;
0266
0267
0268 vecmem::cuda::managed_memory_resource managed_resource;
0269
0270
0271 vecmem::vector<uint_holder> seq_1({{0u}, {1u}, {2u}, {3u}, {4u}, {5u}},
0272 &managed_resource);
0273 vecmem::vector<uint_holder> seq_2({{2u}, {0u}, {9u}, {4u}, {15u}},
0274 &managed_resource);
0275
0276 auto seq_data_1 = vecmem::get_data(seq_1);
0277 auto seq_data_2 = vecmem::get_data(seq_2);
0278
0279
0280 vecmem::data::vector_buffer<dindex> value_buffer(
0281 static_cast<vecmem::data::vector_buffer<dindex>::size_type>(seq_1.size() +
0282 seq_2.size()),
0283 managed_resource, vecmem::data::buffer_type::resizable);
0284 copy.setup(value_buffer)->wait();
0285
0286
0287 test_static_join(seq_data_1, seq_data_2, value_buffer);
0288
0289
0290 vecmem::vector<dindex> value_vec{&managed_resource};
0291 copy(value_buffer, value_vec)->wait();
0292
0293
0294 for (std::size_t i = 0u; i < seq_1.size(); i++) {
0295 ASSERT_EQ(seq_1[i].ui, value_vec[i]);
0296 }
0297
0298 for (std::size_t i = 0u; i < seq_1.size(); i++) {
0299 ASSERT_EQ(seq_2[i].ui, value_vec[i + seq_1.size()]);
0300 }
0301 }
0302
0303
0304 TEST(utils_ranges_cuda, subrange) {
0305
0306 vecmem::cuda::copy copy;
0307
0308
0309 vecmem::cuda::managed_memory_resource managed_resource;
0310
0311
0312 vecmem::vector<int> seq({0, 1, 2, 3, 4, 5}, &managed_resource);
0313
0314 auto seq_data = vecmem::get_data(seq);
0315
0316
0317 const std::size_t begin{1u};
0318 const std::size_t end{4u};
0319
0320
0321 vecmem::data::vector_buffer<int> check_buffer(
0322 static_cast<vecmem::data::vector_buffer<int>::size_type>(end - begin),
0323 managed_resource, vecmem::data::buffer_type::resizable);
0324 copy.setup(check_buffer)->wait();
0325
0326
0327 test_subrange(seq_data, check_buffer, begin, end);
0328
0329
0330 vecmem::vector<int> check{&managed_resource};
0331 copy(check_buffer, check)->wait();
0332
0333
0334 ASSERT_EQ(check[0], 1);
0335 ASSERT_EQ(check[1], 2);
0336 ASSERT_EQ(check[2], 3);
0337 }