Skip to content

Commit fa2e216

Browse files
authored
Merge pull request #1050 from beomki-yeo/fast-measurement-lookup
Use a map to find the unique measurement ID
1 parent 9355f57 commit fa2e216

13 files changed

+166
-34
lines changed

device/common/include/traccc/ambiguity_resolution/device/count_removable_tracks.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ struct count_removable_tracks_payload {
5656
*/
5757
vecmem::data::vector_view<const measurement_id_type> unique_meas_view;
5858

59+
/**
60+
* @brief View object to the meas id to unique id map
61+
*/
62+
vecmem::data::vector_view<const unsigned int> meas_id_to_unique_id_view;
63+
5964
/**
6065
* @brief View object to the number of accepted tracks per measurement
6166
*/

device/common/include/traccc/ambiguity_resolution/device/count_shared_measurements.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ struct count_shared_measurements_payload {
3131
vecmem::data::jagged_vector_view<const measurement_id_type> meas_ids_view;
3232

3333
/**
34-
* @brief View object to the unique measurement ids
34+
* @brief View object to the meas id to unique id map
3535
*/
36-
vecmem::data::vector_view<const measurement_id_type> unique_meas_view;
36+
vecmem::data::vector_view<const unsigned int> meas_id_to_unique_id_view;
3737

3838
/**
3939
* @brief View object to the tracks per measurement

device/common/include/traccc/ambiguity_resolution/device/fill_tracks_per_measurement.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ struct fill_tracks_per_measurement_payload {
3434
vecmem::data::jagged_vector_view<const measurement_id_type> meas_ids_view;
3535

3636
/**
37-
* @brief View object to the unique measurement ids
37+
* @brief View object to the meas id to unique id map
3838
*/
39-
vecmem::data::vector_view<const measurement_id_type> unique_meas_view;
39+
vecmem::data::vector_view<const unsigned int> meas_id_to_unique_id_view;
4040

4141
/**
4242
* @brief View object to the tracks per measurement
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/** TRACCC library, part of the ACTS project (R&D line)
2+
*
3+
* (c) 2025 CERN for the benefit of the ACTS project
4+
*
5+
* Mozilla Public License Version 2.0
6+
*/
7+
8+
#pragma once
9+
10+
// Project include(s).
11+
#include "traccc/definitions/primitives.hpp"
12+
13+
// VecMem include(s).
14+
#include <vecmem/containers/data/vector_view.hpp>
15+
16+
namespace traccc::device {
17+
18+
/// (Event Data) Payload for the @c traccc::device::fill_unique_meas_id_map
19+
/// function
20+
struct fill_unique_meas_id_map_payload {
21+
22+
/**
23+
* @brief View object to the unique measurement ids
24+
*/
25+
vecmem::data::vector_view<const measurement_id_type> unique_meas_view;
26+
27+
/**
28+
* @brief View object to the meas id to unique id map
29+
*/
30+
vecmem::data::vector_view<unsigned int> meas_id_to_unique_id_view;
31+
};
32+
33+
} // namespace traccc::device

device/common/include/traccc/ambiguity_resolution/device/remove_tracks.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ struct remove_tracks_payload {
4242
vecmem::data::vector_view<const unsigned int> n_meas_view;
4343

4444
/**
45-
* @brief View object to the unique measurement ids
45+
* @brief View object to the meas id to unique id map
4646
*/
47-
vecmem::data::vector_view<const measurement_id_type> unique_meas_view;
47+
vecmem::data::vector_view<const unsigned int> meas_id_to_unique_id_view;
4848

4949
/**
5050
* @brief View object to the tracks per measurement

device/cuda/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ traccc_add_library( traccc_cuda cuda TYPE SHARED
9797
"src/ambiguity_resolution/kernels/fill_inverted_ids.cuh"
9898
"src/ambiguity_resolution/kernels/fill_tracks_per_measurement.cu"
9999
"src/ambiguity_resolution/kernels/fill_tracks_per_measurement.cuh"
100+
"src/ambiguity_resolution/kernels/fill_unique_meas_id_map.cu"
101+
"src/ambiguity_resolution/kernels/fill_unique_meas_id_map.cuh"
100102
"src/ambiguity_resolution/kernels/fill_track_candidates.cu"
101103
"src/ambiguity_resolution/kernels/fill_track_candidates.cuh"
102104
"src/ambiguity_resolution/kernels/fill_vectors.cu"

device/cuda/src/ambiguity_resolution/greedy_ambiguity_resolution_algorithm.cu

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "./kernels/fill_inverted_ids.cuh"
1717
#include "./kernels/fill_track_candidates.cuh"
1818
#include "./kernels/fill_tracks_per_measurement.cuh"
19+
#include "./kernels/fill_unique_meas_id_map.cuh"
1920
#include "./kernels/fill_vectors.cuh"
2021
#include "./kernels/find_max_shared.cuh"
2122
#include "./kernels/gather_tracks.cuh"
@@ -28,6 +29,7 @@
2829

2930
// Thrust include(s).
3031
#include <thrust/execution_policy.h>
32+
#include <thrust/extrema.h>
3133
#include <thrust/fill.h>
3234
#include <thrust/functional.h>
3335
#include <thrust/iterator/constant_iterator.h>
@@ -62,6 +64,13 @@ struct track_comparator {
6264
}
6365
};
6466

67+
struct measurement_id_comparator {
68+
TRACCC_HOST_DEVICE bool operator()(const measurement& a,
69+
const measurement& b) const {
70+
return a.measurement_id < b.measurement_id;
71+
}
72+
};
73+
6574
greedy_ambiguity_resolution_algorithm::greedy_ambiguity_resolution_algorithm(
6675
const config_type& cfg, const traccc::memory_resource& mr,
6776
vecmem::copy& copy, stream& str, std::unique_ptr<const Logger> logger)
@@ -77,6 +86,30 @@ greedy_ambiguity_resolution_algorithm::operator()(
7786
const edm::track_candidate_container<default_algebra>::const_view&
7887
track_candidates_view) const {
7988

89+
measurement_collection_types::const_device measurements(
90+
track_candidates_view.measurements);
91+
92+
auto n_meas_total =
93+
m_copy.get().get_size(track_candidates_view.measurements);
94+
95+
// Make sure that max_measurement_id = number_of_measurement -1
96+
// @TODO: More robust way is to assert that measurement id ranges from 0, 1,
97+
// ..., number_of_measurement - 1
98+
[[maybe_unused]] auto max_meas_it = thrust::max_element(
99+
thrust::device, track_candidates_view.measurements.ptr(),
100+
track_candidates_view.measurements.ptr() + n_meas_total,
101+
measurement_id_comparator{});
102+
103+
measurement max_meas;
104+
cudaMemcpy(&max_meas, thrust::raw_pointer_cast(&(*max_meas_it)),
105+
sizeof(measurement), cudaMemcpyDeviceToHost);
106+
107+
if (max_meas.measurement_id != n_meas_total - 1) {
108+
throw std::runtime_error(
109+
"max measurement id should be equal to (the number of measurements "
110+
"- 1)");
111+
}
112+
80113
// Get a convenience variable for the stream that we'll be using.
81114
cudaStream_t stream = details::get_stream(m_stream);
82115

@@ -199,6 +232,24 @@ greedy_ambiguity_resolution_algorithm::operator()(
199232
unique_meas_buffer.ptr() + meas_count,
200233
unique_meas_counts_buffer.ptr());
201234

235+
// Unique measurement ids
236+
vecmem::data::vector_buffer<measurement_id_type>
237+
meas_id_to_unique_id_buffer{max_meas.measurement_id, m_mr.main};
238+
239+
// Make meas_id to meas vector
240+
{
241+
const unsigned int nThreads = m_warp_size * 2;
242+
const unsigned int nBlocks = (meas_count + nThreads - 1) / nThreads;
243+
244+
kernels::fill_unique_meas_id_map<<<nBlocks, nThreads, 0, stream>>>(
245+
device::fill_unique_meas_id_map_payload{
246+
.unique_meas_view = unique_meas_buffer,
247+
.meas_id_to_unique_id_view = meas_id_to_unique_id_buffer});
248+
TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
249+
250+
m_stream.get().synchronize();
251+
}
252+
202253
// Retreive the counting vector to host
203254
std::vector<std::size_t> unique_meas_counts;
204255
m_copy
@@ -235,7 +286,7 @@ greedy_ambiguity_resolution_algorithm::operator()(
235286
device::fill_tracks_per_measurement_payload{
236287
.accepted_ids_view = pre_accepted_ids_buffer,
237288
.meas_ids_view = meas_ids_buffer,
238-
.unique_meas_view = unique_meas_buffer,
289+
.meas_id_to_unique_id_view = meas_id_to_unique_id_buffer,
239290
.tracks_per_measurement_view = tracks_per_measurement_buffer,
240291
.track_status_per_measurement_view =
241292
track_status_per_measurement_buffer,
@@ -262,7 +313,7 @@ greedy_ambiguity_resolution_algorithm::operator()(
262313
device::count_shared_measurements_payload{
263314
.accepted_ids_view = pre_accepted_ids_buffer,
264315
.meas_ids_view = meas_ids_buffer,
265-
.unique_meas_view = unique_meas_buffer,
316+
.meas_id_to_unique_id_view = meas_id_to_unique_id_buffer,
266317
.n_accepted_tracks_per_measurement_view =
267318
n_accepted_tracks_per_measurement_buffer,
268319
.n_shared_view = n_shared_buffer});
@@ -405,7 +456,7 @@ greedy_ambiguity_resolution_algorithm::operator()(
405456
.n_accepted = n_accepted_device.get(),
406457
.meas_ids_view = meas_ids_buffer,
407458
.n_meas_view = n_meas_buffer,
408-
.unique_meas_view = unique_meas_buffer,
459+
.meas_id_to_unique_id_view = meas_id_to_unique_id_buffer,
409460
.n_accepted_tracks_per_measurement_view =
410461
n_accepted_tracks_per_measurement_buffer,
411462
.n_removable_tracks = n_removable_tracks_device.get(),
@@ -432,7 +483,7 @@ greedy_ambiguity_resolution_algorithm::operator()(
432483
.n_accepted = n_accepted_device.get(),
433484
.meas_ids_view = meas_ids_buffer,
434485
.n_meas_view = n_meas_buffer,
435-
.unique_meas_view = unique_meas_buffer,
486+
.meas_id_to_unique_id_view = meas_id_to_unique_id_buffer,
436487
.tracks_per_measurement_view = tracks_per_measurement_buffer,
437488
.track_status_per_measurement_view =
438489
track_status_per_measurement_buffer,

device/cuda/src/ambiguity_resolution/kernels/count_removable_tracks.cu

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,10 @@ __global__ void count_removable_tracks(
8585
vecmem::device_vector<measurement_id_type> meas_to_remove(
8686
payload.meas_to_remove_view);
8787
vecmem::device_vector<unsigned int> threads(payload.threads_view);
88-
vecmem::device_vector<const measurement_id_type> unique_meas(
89-
payload.unique_meas_view);
9088
vecmem::device_vector<const unsigned int> n_accepted_tracks_per_measurement(
9189
payload.n_accepted_tracks_per_measurement_view);
90+
vecmem::device_vector<const unsigned int> meas_id_to_unique_id(
91+
payload.meas_id_to_unique_id_view);
9292

9393
auto threadIndex = threadIdx.x;
9494

@@ -193,10 +193,7 @@ __global__ void count_removable_tracks(
193193
auto mid = sh_meas_ids[threadIndex];
194194
bool is_start =
195195
(threadIndex == 0) || (sh_meas_ids[threadIndex - 1] != mid);
196-
const std::size_t unique_meas_idx =
197-
thrust::lower_bound(thrust::seq, unique_meas.begin(),
198-
unique_meas.end(), mid) -
199-
unique_meas.begin();
196+
const auto unique_meas_idx = meas_id_to_unique_id.at(mid);
200197

201198
if (is_start) {
202199

device/cuda/src/ambiguity_resolution/kernels/count_shared_measurements.cu

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ __global__ void count_shared_measurements(
3333

3434
vecmem::jagged_device_vector<const measurement_id_type> meas_ids(
3535
payload.meas_ids_view);
36-
vecmem::device_vector<const measurement_id_type> unique_meas(
37-
payload.unique_meas_view);
36+
vecmem::device_vector<const unsigned int> meas_id_to_unique_id(
37+
payload.meas_id_to_unique_id_view);
3838
vecmem::device_vector<const unsigned int> n_accepted_tracks_per_measurement(
3939
payload.n_accepted_tracks_per_measurement_view);
4040
vecmem::device_vector<unsigned int> n_shared(payload.n_shared_view);
@@ -43,10 +43,7 @@ __global__ void count_shared_measurements(
4343

4444
for (const auto& meas_id : meas_ids[id]) {
4545

46-
const auto it = thrust::lower_bound(thrust::seq, unique_meas.begin(),
47-
unique_meas.end(), meas_id);
48-
const auto unique_meas_idx = static_cast<unsigned int>(
49-
thrust::distance(unique_meas.begin(), it));
46+
const auto unique_meas_idx = meas_id_to_unique_id.at(meas_id);
5047

5148
if (n_accepted_tracks_per_measurement.at(unique_meas_idx) > 1) {
5249
vecmem::device_atomic_ref<unsigned int>(n_shared.at(id))

device/cuda/src/ambiguity_resolution/kernels/fill_tracks_per_measurement.cu

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ __global__ void fill_tracks_per_measurement(
3333

3434
vecmem::jagged_device_vector<const measurement_id_type> meas_ids(
3535
payload.meas_ids_view);
36-
vecmem::device_vector<const measurement_id_type> unique_meas(
37-
payload.unique_meas_view);
36+
vecmem::device_vector<const unsigned int> meas_id_to_unique_id(
37+
payload.meas_id_to_unique_id_view);
3838
vecmem::jagged_device_vector<unsigned int> tracks_per_measurement(
3939
payload.tracks_per_measurement_view);
4040
vecmem::jagged_device_vector<int> track_status_per_measurement(
@@ -53,10 +53,7 @@ __global__ void fill_tracks_per_measurement(
5353
continue;
5454
}
5555

56-
const auto it = thrust::lower_bound(thrust::seq, unique_meas.begin(),
57-
unique_meas.end(), meas_id);
58-
const std::size_t unique_meas_idx =
59-
static_cast<std::size_t>(thrust::distance(unique_meas.begin(), it));
56+
const auto unique_meas_idx = meas_id_to_unique_id.at(meas_id);
6057

6158
auto tracks = tracks_per_measurement.at(unique_meas_idx);
6259

0 commit comments

Comments
 (0)