片刻后,工作线程停止工作

Woo*_*kai 2 c++ multithreading openmp

我有一个使用OpenMP并行化的串行应用程序.我只是将以下内容添加到我的主循环中:

#pragma omp parallel for default(shared)
for (int i = 0; i < numberOfEmitters; ++i)
{
    computeTrajectoryParams* params = new computeTrajectoryParams;
            // defining params...
    outputs[i] = (int*) ComputeTrajectory(params);

    delete params;
}
Run Code Online (Sandbox Code Playgroud)

它似乎运行良好:在开始时,我的所有工作线程执行循环的迭代,一切都很快,我有100%的CPU负载(在四核机器上).然而,片刻后,工作线程的一个停止,并保持在一个调用的函数_vcomp::PersistentThreadFuncvcomp90.dll(该文件vctools\openmprt\src\ttpool.cpp),然后又等......直到只剩下主线程保持工作.

有人知道为什么会这样吗?在大约一半的迭代被执行后,这开始发生.

Ann*_*nna 6

它可能取决于调度方案,以及每个周期中的计算大小.如果调度是静态的 - 每个线程在运行之前都会分配工作.每个线程将获得1/4的索引.有些线程有可能在其他线程之前完成,因为它们的工作比其他线程更容易(或者可能只是其他线程的负载较少).

尝试使用动态调度,看看它是否更好.