我要在C ++中运行多个仿真实例,并希望使用期货进行分发以减少程序的运行时间。主函数runSimulation
接受一个Parameters
对象,并返回结果列表(精确的说是double的向量)。
如果我让所有程序按顺序运行,则可以运行(但速度很慢)。如果我使用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());
}
请注意,只有一些期货挂起,而其他期货则按预期运行(这可以通过查看我的系统监视器及其CPU使用率来观察)。
如果我将Future-part替换为
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 ...)。
您知道什么可能导致此行为或如何解决此问题,以便我可以在不同的内核上运行仿真吗?