【发布时间】:2012-09-27 05:47:45
【问题描述】:
我有一个用于物理模拟的简单程序。我想知道如何在 OpenMP 中实现某种线程范式。
int main()
{
#define steps (100000)
for (int t = 0;t < steps; t++)
{
firstParallelLoop();
secondParallelLoop();
if (!(t%100))
{
checkpoint();
}
}
}
void firstParallelLoop()
{// In another file.c
#pragma omp parallel for
for (int i = 0; i < sizeOfSim;i++)
{
//Some atomic floating point ops.
}
}
以前,我使用 pthreads 并在我的双核笔记本电脑上获得了 1.7 的加速。使用 OpenMP 时,我似乎无法获得任何加速。我怀疑问题在于线程组/池正在迅速被创建和销毁,并带来灾难性的影响。
在我的 pthreads 实现中,我需要确保没有创建新线程,并且我的程序表现为客户端-服务器。在 pthreads 方案中,main() 是一个服务器,对 firstParallelLoop 的调用将释放触发线程重新处理数据的互斥体/信号量。
当我查看 CPU 利用率时,我预计它会超过 30%(4 核,2 是 HT),但它保持在 27 左右...
如何让 OpenMP 做类似的事情?如何让 OpenMP 重用我的线程?
【问题讨论】:
-
您是否启用了正确的编译器选项? OpenMP 的大多数实现确实会池化线程。
-
如果您的 CPU 使用率没有增加,那么您可能从未启用过 OpenMP。你的编译选项是什么?
sizeOfSim有多大? -
sizeOfSim 是一个 10,000 x 10,000 的网格,其中邻居被平均和缩放 (FDTD)。我想我想要弄清楚的是如何调试 OpenMP 正在做什么?我可以强制 OpenMP 池线程吗?
-
那么您使用的是哪些编译器选项?我仍然怀疑您从未启用过 OpenMP。
-
-ffast-math -mtune=corei7 -march=corei7 -fopenmp 用于 gcc 和 -lmgl -lgomp 用于 ldd