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

时间:2009-08-27 10:12:25

标签: 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;
}

它似乎运行良好:在开始时,我的所有工作线程执行循环的迭代,一切都很快,我有100%的CPU负载(在四核机器上)。但是,片刻之后,其中一个工作线程停止,并停留在_vcomp::PersistentThreadFunc的{​​{1}}函数中(文件为vcomp90.dll),然后是另一个,等等......直到只有主线程仍然有效。

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

对您的代码的评论很少:如果您的ComputeTrajectory的执行时间以毫秒为单位并且您有多次迭代,那么您应该确保您有一个MP优化的内存分配器,因为您在每次迭代中分配并且(仍然在今天)大多数分配器都有一个全局锁定的全局池。

你也可以考虑完全从循环中获取分配,但是没有足够的信息来知道它是否可以在这里。