Skip to content

Commit e2e218e

Browse files
committed
TPC Workflow: Use uninitialized vectors in TPC reco workflow as output types
1 parent ef15338 commit e2e218e

1 file changed

Lines changed: 8 additions & 7 deletions

File tree

Detectors/TPC/workflow/src/CATrackerSpec.cxx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,6 @@ DataProcessorSpec getCATrackerSpec(CompletionPolicyData* policyData, ca::Config
510510
}
511511
// a byte size resizable vector object, the DataAllocator returns reference to internal object
512512
// initialize optional pointer to the vector object
513-
using O2CharVectorOutputType = std::decay_t<decltype(pc.outputs().make<std::vector<char>>(Output{"", "", 0}))>;
514513
TPCSectorHeader clusterOutputSectorHeader{0};
515514
if (processAttributes->clusterOutputIds.size() > 0) {
516515
clusterOutputSectorHeader.sectorBits = processAttributes->tpcSectorMask;
@@ -519,32 +518,34 @@ DataProcessorSpec getCATrackerSpec(CompletionPolicyData* policyData, ca::Config
519518
}
520519

521520
GPUInterfaceOutputs outputRegions;
522-
using outputBufferType = std::pair<std::optional<std::reference_wrapper<O2CharVectorOutputType>>, char*>;
521+
using outputDataType = char;
522+
using outputBufferUninitializedVector = std::decay_t<decltype(pc.outputs().make<DataAllocator::UninitializedVector<outputDataType>>(Output{"", "", 0}))>;
523+
using outputBufferType = std::pair<std::optional<std::reference_wrapper<outputBufferUninitializedVector>>, outputDataType*>;
523524
std::vector<outputBufferType> outputBuffers(GPUInterfaceOutputs::count(), {std::nullopt, nullptr});
524525

525526
auto setOutputAllocator = [&specconfig, &outputBuffers, &outputRegions, &processAttributes, &pc, verbosity](const char* name, bool condition, GPUOutputControl& region, auto&& outputSpec, size_t offset = 0) {
526527
if (condition) {
527528
auto& buffer = outputBuffers[outputRegions.getIndex(region)];
528529
if (processAttributes->allocateOutputOnTheFly) {
529-
region.allocator = [name, &buffer, &pc, outputSpec = std::move(outputSpec), debug = processAttributes->config->configProcessing.debugLevel, verbosity, offset](size_t size) -> void* {
530+
region.allocator = [name, &buffer, &pc, outputSpec = std::move(outputSpec), verbosity, offset](size_t size) -> void* {
530531
size += offset;
531532
if (verbosity) {
532533
LOG(INFO) << "ALLOCATING " << size << " bytes for " << std::get<DataOrigin>(outputSpec).template as<std::string>() << "/" << std::get<DataDescription>(outputSpec).template as<std::string>() << "/" << std::get<2>(outputSpec);
533534
}
534535
std::chrono::time_point<std::chrono::high_resolution_clock> start, end;
535-
if (debug) {
536+
if (verbosity) {
536537
start = std::chrono::high_resolution_clock::now();
537538
}
538-
buffer.first.emplace(pc.outputs().make<std::vector<char>>(std::make_from_tuple<Output>(outputSpec), size));
539-
if (debug) {
539+
buffer.first.emplace(pc.outputs().make<DataAllocator::UninitializedVector<outputDataType>>(std::make_from_tuple<Output>(outputSpec), size));
540+
if (verbosity) {
540541
end = std::chrono::high_resolution_clock::now();
541542
std::chrono::duration<double> elapsed_seconds = end - start;
542543
LOG(INFO) << "Allocation time for " << name << " (" << size << " bytes)" << ": " << elapsed_seconds.count() << "s";
543544
}
544545
return (buffer.second = buffer.first->get().data()) + offset;
545546
};
546547
} else {
547-
buffer.first.emplace(pc.outputs().make<std::vector<char>>(std::make_from_tuple<Output>(outputSpec), processAttributes->outputBufferSize));
548+
buffer.first.emplace(pc.outputs().make<DataAllocator::UninitializedVector<outputDataType>>(std::make_from_tuple<Output>(outputSpec), processAttributes->outputBufferSize));
548549
region.ptrBase = (buffer.second = buffer.first->get().data()) + offset;
549550
region.size = buffer.first->get().size() - offset;
550551
}

0 commit comments

Comments
 (0)