Я запускаю несколько экземпляров симуляции в C ++, которые я хочу распространять, используя фьючерсы, чтобы уменьшить время выполнения программы.Основная функция runSimulation
принимает объект Parameters
и возвращает список результатов (точнее, вектор двойных значений).
Если я позволю всему работать последовательно, это будет работать (но медленно).Если я использую std::async
, некоторые, но не все будущие вызовы застревают и ничего не возвращают.
Мой код выглядит следующим образом:
const int l = 8; // number of simulations to run
std::vector<Parameters> params = createRandomParameters(l);
std::vector<std::vector<double>> simRes;
simRes.reserve(l);
// set up the futures
std::vector<std::future<std::vector<double>>> futures;
futures.reserve(l);
// create the futures
for (int i = 0; i < l; ++i) {
futures.push_back(std::async(std::launch::async, &runSimulation, params[i]));
}
// get the results
for (auto &fut : futures) {
simRes.push_back(fut.get());
}
Обратите внимание, что только некоторые из фьючерсовзависание, в то время как другие работают, как и ожидалось (это можно увидеть, посмотрев на мой системный монитор и загрузку его ЦП).
Последовательный
Если я заменю часть фьючерса на
for (int i = 0; i < l; ++i) simRes.push_back(runSimulation(params[i]));
все работает (но, конечно, медленно), поэтому я думаю, что ошибка не в функции симуляции.
Отложено
Использование std::launch::deferred
вместо std::launch::async
также работает, но так как я вызываю fut.get()
последовательно, выполнение не выполняется параллельно.
Опуская std::launch
вне (т. е. futures.emplace_back(std::async(&runSimulation, params[i]));
приводит к тому же поведению, что и с std::launch::async
.
К сожалению, я не могу воспроизвести эту ошибку с другой функцией MWE.
Система
Я использую Ubuntu 18.04.1 с gcc 7.3.0
. В CMake я указываю -pthread
отметьте и используйте C ++ 17 (я также пробовал 11 и 14 ...).
Любая идея, что можетвызвать такое поведение или как это исправить, чтобы я мог запустить симуляцию на разных ядрах?