我有一个使用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;
}

它似乎运行良好:一开始,我所有的工作线程都执行了循环的迭代,一切进展很快,并且我有100%的CPU负载(在四核计算机上)。但是,片刻之后,一个工作线程停止,并停留在_vcomp::PersistentThreadFunc(文件为vcomp90.dll)中的一个称为vctools\openmprt\src\ttpool.cpp的函数中,然后再执行另一个操作,依此类推,直到只有主线程仍在工作。

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

最佳答案

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

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

关于c++ - worker 线程片刻后停止工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1340099/

10-17 02:27