@@ -593,25 +593,32 @@ void TrackerTraits<nLayers>::findRoads(const int iteration)
593593 lastCellSeed.swap (updatedCellSeed);
594594 lastCellId.swap (updatedCellId);
595595 deepVectorClear (updatedCellSeed); // / tame the memory peaks
596- updatedCellId. clear ();
596+ deepVectorClear (updatedCellId); // / tame the memory peaks
597597 processNeighbours (iLayer, --level, lastCellSeed, lastCellId, updatedCellSeed, updatedCellId);
598598 }
599- for (auto & seed : updatedCellSeed) {
600- if (seed.getQ2Pt () > 1 .e3 || seed.getChi2 () > mTrkParams [0 ].MaxChi2NDF * ((startLevel + 2 ) * 2 - 5 )) {
601- continue ;
602- }
603- trackSeeds.push_back (seed);
604- }
599+ std::copy_if (updatedCellSeed.begin (), updatedCellSeed.end (), std::back_inserter (trackSeeds), [&](const CellSeed& seed) {
600+ return seed.getQ2Pt () <= 1 .e3 && seed.getChi2 () <= mTrkParams [0 ].MaxChi2NDF * ((startLevel + 2 ) * 2 - 5 );
601+ });
605602 }
606603
607- bounded_vector<TrackITSExt> tracks (trackSeeds.size (), mMemoryPool .get ());
608- std::atomic<size_t > trackIndex{0 };
604+ if (trackSeeds.empty ()) {
605+ continue ;
606+ }
609607
608+ bounded_vector<TrackITSExt> tracks (mMemoryPool .get ());
609+ tracks.reserve (trackSeeds.size ());
610610 mTaskArena .execute ([&] {
611+ tbb::combinable<bounded_vector<TrackITSExt>> locTracksData ([&] {
612+ return bounded_vector<TrackITSExt>(mMemoryPool .get ());
613+ });
614+
611615 tbb::parallel_for (
612616 tbb::blocked_range<size_t >(size_t (0 ), trackSeeds.size ()),
613617 [&](const tbb::blocked_range<size_t >& Seeds) {
614618 for (int iSeed = Seeds.begin (); iSeed < Seeds.end (); ++iSeed) {
619+ auto & localTracks = locTracksData.local ();
620+ localTracks.reserve (Seeds.size ());
621+
615622 const CellSeed& seed{trackSeeds[iSeed]};
616623 TrackITSExt temporaryTrack{seed};
617624 temporaryTrack.resetCovariance ();
@@ -631,13 +638,15 @@ void TrackerTraits<nLayers>::findRoads(const int iteration)
631638 if (!fitSuccess || temporaryTrack.getPt () < mTrkParams [iteration].MinPt [mTrkParams [iteration].NLayers - temporaryTrack.getNClusters ()]) {
632639 continue ;
633640 }
634- tracks[trackIndex++] = temporaryTrack;
641+ localTracks. push_back ( temporaryTrack) ;
635642 }
636643 });
637- });
638644
639- tracks.resize (trackIndex);
640- mTaskArena .execute ([&] {
645+ locTracksData.combine_each ([&](const bounded_vector<TrackITSExt>& localTracks) {
646+ tracks.insert (tracks.end (), localTracks.begin (), localTracks.end ());
647+ });
648+ tracks.shrink_to_fit ();
649+
641650 tbb::parallel_sort (tracks.begin (), tracks.end (), [](const auto & a, const auto & b) {
642651 return a.getChi2 () < b.getChi2 ();
643652 });
0 commit comments