From 72ba9dfafd0d7495602e6453d0e21ab1e569f1e0 Mon Sep 17 00:00:00 2001 From: Daniel Weindl Date: Tue, 19 Nov 2024 19:55:08 +0100 Subject: [PATCH] Fix data race in aggregateLikelihood Fixes a data race in case of multi-threaded simulations. nllh, objectiveFunctionGradient and simulationTimeSec are potentially updated by different threads at the same time. --- src/parpeamici/multiConditionProblem.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/parpeamici/multiConditionProblem.cpp b/src/parpeamici/multiConditionProblem.cpp index 8f1599dc..9869d05f 100644 --- a/src/parpeamici/multiConditionProblem.cpp +++ b/src/parpeamici/multiConditionProblem.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -719,6 +720,9 @@ int AmiciSummedGradientFunction::runSimulations( std::vector const& dataIndices, Logger *logger, double *cpuTime) const { int errors = 0; + // Mutex to protect likelihood and gradient that are potentially updated + // by multiple threads + std::mutex mutex; auto parameterVector = std::vector( optimizationParameters.begin(), @@ -732,7 +736,10 @@ int AmiciSummedGradientFunction::runSimulations( : amici::SensitivityOrder::none, dataIndices, [&nllh, &objectiveFunctionGradient, &simulationTimeSec, - &optimizationParameters, &errors, this](JobData *job, int /*jobIdx*/) { + &optimizationParameters, &errors, &mutex, this](JobData *job, int /*jobIdx*/) { + // protect shared variables llh, gradient, simulationTimeSec + std::lock_guard lock(mutex); + errors += this->aggregateLikelihood(*job, nllh, objectiveFunctionGradient,