我有一个用于物理模拟的简单程序。我想知道如何在 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 重用我的线程?