2

我有一个使用 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::PersistentThreadFuncvcomp90.dll(文件为vctools\openmprt\src\ttpool.cpp)调用的函数中,然后是另一个,等等......直到只有主线程仍在工作。

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

4

2 回答 2

6

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

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

于 2009-08-27T10:32:07.570 回答
2

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

您也可以考虑让分配完全脱离循环,但没有足够的信息知道这里是否可行。

于 2009-08-27T22:08:34.453 回答