13
13
#include " traccc/definitions/primitives.hpp"
14
14
#include " traccc/definitions/qualifiers.hpp"
15
15
#include " traccc/edm/device/finding_global_counter.hpp"
16
+ #include " traccc/edm/device/theta_id.hpp"
16
17
#include " traccc/finding/candidate_link.hpp"
17
18
#include " traccc/finding/device/add_links_for_holes.hpp"
18
19
#include " traccc/finding/device/apply_interaction.hpp"
@@ -105,6 +106,7 @@ __global__ void find_tracks(
105
106
vecmem::data::vector_view<const unsigned int > prev_param_to_link_view,
106
107
const unsigned int step, const unsigned int n_max_candidates,
107
108
bound_track_parameters_collection_types::view out_params_view,
109
+ vecmem::data::vector_view<device::theta_id> theta_id_view,
108
110
vecmem::data::vector_view<unsigned int > n_candidates_view,
109
111
vecmem::data::vector_view<candidate_link> links_view,
110
112
unsigned int & n_candidates) {
@@ -115,7 +117,7 @@ __global__ void find_tracks(
115
117
gid, cfg, det_data, measurements_view, in_params_view,
116
118
n_measurements_prefix_sum_view, ref_meas_idx_view, prev_links_view,
117
119
prev_param_to_link_view, step, n_max_candidates, out_params_view,
118
- n_candidates_view, links_view, n_candidates);
120
+ theta_id_view, n_candidates_view, links_view, n_candidates);
119
121
}
120
122
121
123
// / CUDA kernel for running @c traccc::device::add_links_for_holes
@@ -126,15 +128,16 @@ __global__ void add_links_for_holes(
126
128
vecmem::data::vector_view<const unsigned int > prev_param_to_link_view,
127
129
const unsigned int step, const unsigned int n_max_candidates,
128
130
bound_track_parameters_collection_types::view out_params_view,
131
+ vecmem::data::vector_view<device::theta_id> theta_id_view,
129
132
vecmem::data::vector_view<candidate_link> links_view,
130
133
unsigned int & n_total_candidates) {
131
134
132
135
int gid = threadIdx .x + blockIdx .x * blockDim .x ;
133
136
134
137
device::add_links_for_holes (gid, n_candidates_view, in_params_view,
135
138
prev_links_view, prev_param_to_link_view, step,
136
- n_max_candidates, out_params_view, links_view,
137
- n_total_candidates);
139
+ n_max_candidates, out_params_view,
140
+ theta_id_view, links_view, n_total_candidates);
138
141
}
139
142
140
143
// / CUDA kernel for running @c traccc::device::propagate_to_next_surface
@@ -144,6 +147,7 @@ __global__ void propagate_to_next_surface(
144
147
typename propagator_t ::detector_type::view_type det_data,
145
148
bfield_t field_data,
146
149
bound_track_parameters_collection_types::const_view in_params_view,
150
+ vecmem::data::vector_view<const device::theta_id> theta_id_view,
147
151
vecmem::data::vector_view<const candidate_link> links_view,
148
152
const unsigned int step, const unsigned int & n_candidates,
149
153
bound_track_parameters_collection_types::view out_params_view,
@@ -156,9 +160,9 @@ __global__ void propagate_to_next_surface(
156
160
int gid = threadIdx .x + blockIdx .x * blockDim .x ;
157
161
158
162
device::propagate_to_next_surface<propagator_t , bfield_t , config_t >(
159
- gid, cfg, det_data, field_data, in_params_view, links_view, step ,
160
- n_candidates, out_params_view, param_to_link_view, tips_view ,
161
- n_tracks_per_seed_view, n_out_params);
163
+ gid, cfg, det_data, field_data, in_params_view, theta_id_view ,
164
+ links_view, step, n_candidates, out_params_view, param_to_link_view,
165
+ tips_view, n_tracks_per_seed_view, n_out_params);
162
166
}
163
167
164
168
// / CUDA kernel for running @c traccc::device::build_tracks
@@ -412,6 +416,8 @@ finding_algorithm<stepper_t, navigator_t>::operator()(
412
416
413
417
bound_track_parameters_collection_types::buffer updated_params_buffer (
414
418
n_in_params * m_cfg.max_num_branches_per_surface , m_mr.main );
419
+ vecmem::data::vector_buffer<device::theta_id> theta_and_id_buffer (
420
+ n_in_params * m_cfg.max_num_branches_per_surface , m_mr.main );
415
421
416
422
// Create the link map
417
423
link_map[step] = {n_in_params * m_cfg.max_num_branches_per_surface ,
@@ -428,7 +434,7 @@ finding_algorithm<stepper_t, navigator_t>::operator()(
428
434
n_measurements_prefix_sum_buffer, ref_meas_idx_buffer,
429
435
link_map[prev_step], param_to_link_map[prev_step], step,
430
436
n_max_candidates, updated_params_buffer,
431
- n_candidates_buffer, link_map[step],
437
+ theta_and_id_buffer, n_candidates_buffer, link_map[step],
432
438
(*global_counter_device).n_candidates );
433
439
TRACCC_CUDA_ERROR_CHECK (cudaGetLastError ());
434
440
}
@@ -443,7 +449,7 @@ finding_algorithm<stepper_t, navigator_t>::operator()(
443
449
kernels::add_links_for_holes<<<nBlocks, nThreads, 0 , stream>>> (
444
450
n_candidates_buffer, in_params_buffer, link_map[prev_step],
445
451
param_to_link_map[prev_step], step, n_max_candidates,
446
- updated_params_buffer, link_map[step],
452
+ updated_params_buffer, theta_and_id_buffer, link_map[step],
447
453
(*global_counter_device).n_candidates );
448
454
TRACCC_CUDA_ERROR_CHECK (cudaGetLastError ());
449
455
}
@@ -456,6 +462,15 @@ finding_algorithm<stepper_t, navigator_t>::operator()(
456
462
457
463
m_stream.synchronize ();
458
464
465
+ // Sort the theta_and_id vector with the link vector
466
+ vecmem::device_vector<device::theta_id> theta_and_id_device (
467
+ theta_and_id_buffer);
468
+ vecmem::device_vector<candidate_link> link_device (link_map[step]);
469
+ thrust::sort_by_key (
470
+ thrust::cuda::par.on (stream), theta_and_id_device.begin (),
471
+ theta_and_id_device.begin () + global_counter_host.n_candidates ,
472
+ link_device.begin (), device::theta_id_sort_comp ());
473
+
459
474
/* ****************************************************************
460
475
* Kernel6: Propagate to the next surface
461
476
*****************************************************************/
@@ -482,8 +497,9 @@ finding_algorithm<stepper_t, navigator_t>::operator()(
482
497
config_type>
483
498
<<<nBlocks, nThreads, 0 , stream>>> (
484
499
m_cfg, det_view, field_view, updated_params_buffer,
485
- link_map[step], step, (*global_counter_device).n_candidates ,
486
- out_params_buffer, param_to_link_map[step], tips_map[step],
500
+ theta_and_id_buffer, link_map[step], step,
501
+ (*global_counter_device).n_candidates , out_params_buffer,
502
+ param_to_link_map[step], tips_map[step],
487
503
n_tracks_per_seed_buffer,
488
504
(*global_counter_device).n_out_params );
489
505
TRACCC_CUDA_ERROR_CHECK (cudaGetLastError ());
0 commit comments