Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions GPU/GPUTracking/Global/GPUChainTrackingClusterizer.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -751,6 +751,9 @@ int32_t GPUChainTracking::RunTPCClusterizer(bool synchronizeOutput)
if (buildNativeGPU) {
AllocateRegisteredMemory(mInputsHost->mResourceClusterNativeBuffer);
}
if (mWaitForFinalInputs && GetProcessingSettings().nTPCClustererLanes > 6) {
GPUFatal("ERROR, mWaitForFinalInputs cannot be called with nTPCClustererLanes > 6");
}
if (buildNativeHost && !(buildNativeGPU && GetProcessingSettings().delayedOutput)) {
if (mWaitForFinalInputs) {
GPUFatal("Cannot use waitForFinalInput callback without delayed output");
Expand Down
14 changes: 9 additions & 5 deletions GPU/Workflow/src/GPUWorkflowPipeline.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,7 @@ void GPURecoWorkflowSpec::initPipeline(o2::framework::InitContext& ic)
mPolicyOrder = [this](o2::framework::DataProcessingHeader::StartTime timeslice) {
std::unique_lock lk(mPipeline->completionPolicyMutex);
mPipeline->completionPolicyNotify.wait(lk, [pipeline = mPipeline.get()] { return pipeline->pipelineSenderTerminating || !pipeline->completionPolicyQueue.empty(); });
if (mPipeline->completionPolicyQueue.front() == timeslice) {
mPipeline->completionPolicyQueue.pop();
return true;
}
return false;
return !mPipeline->completionPolicyQueue.empty() && mPipeline->completionPolicyQueue.front() == timeslice;
};
mPipeline->receiveThread = std::thread([this]() { RunReceiveThread(); });
for (uint32_t i = 0; i < mPipeline->workers.size(); i++) {
Expand Down Expand Up @@ -175,6 +171,14 @@ int32_t GPURecoWorkflowSpec::handlePipeline(ProcessingContext& pc, GPUTrackingIn
tpcZSmeta = std::move(context->tpcZSmeta);
tpcZS = context->tpcZS;
ptrs.tpcZS = &tpcZS;

{
std::lock_guard lk(mPipeline->completionPolicyMutex);
if (mPipeline->completionPolicyQueue.empty() || mPipeline->completionPolicyQueue.front() != tinfo.timeslice) {
LOG(fatal) << "Time frame processed does not equal the timeframe at the top of the queue, time frames seem out of sync";
}
mPipeline->completionPolicyQueue.pop();
}
}
if (mSpecConfig.enableDoublePipeline == 2) {
auto prepareDummyMessage = pc.outputs().make<DataAllocator::UninitializedVector<char>>(Output{gDataOriginGPU, "PIPELINEPREPARE", 0}, 0u);
Expand Down