OpenMP之间的区别是什么:
#pragma omp parallel sections
{
#pragma omp section
{
fct1();
}
#pragma omp section
{
fct2();
}
}
Run Code Online (Sandbox Code Playgroud)
并且:
#pragma omp parallel
{
#pragma omp single
{
#pragma omp task
fct1();
#pragma omp task
fct2();
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定第二个代码是否正确......
我有一个简单的程序,我用于物理模拟.我想知道如何在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.
}
}
Run Code Online (Sandbox Code Playgroud)
以前,我使用pthreads并在我的双核笔记本电脑上获得1.7加速.使用OpenMP时,我似乎无法获得任何加速.我怀疑问题是线程组/池正在快速创建和销毁,带来了灾难性的影响.
在我的pthreads实现中,我需要确保没有创建新线程,并且我的程序表现为客户端 - 服务器.在pthreads方案中,main()是一个服务器,并且调用firstParallelLoop将释放触发线程重新处理数据的互斥锁/信号量.
当我看到CPU利用率时,我预计它将超过30%的标记(4核,2是HT),但它保持在27左右......
如何让OpenMP做类似的事情?如何告诉OpenMP重用我的线程?