我是openMP的新用户,我在linux ubuntu 13.10系统上有一个带有8个内核的intel i7-2670QM CPU
我的程序在C中使用嵌套并行性来创建8个线程的总和。据我所知,每个线程都应该在它自己的处理器上运行,但是当我在终端上运行命令top
时,我看到我的程序只使用了100%的内存(预期为800%),并且在处理器中查看,只有CPU [X]使用100%(X在0到7之间是随机的),其他CPU是0.1%。
当我使用英特尔vtune放大器配置我的程序时,它显示7个线程正在运行,但其中6个完全不使用CPU,因为它们完全是空闲的。
当我尝试另一个示例并行程序时,线程在核心上分裂得很好,所以我认为问题出现在我的代码中:
#include <omp.h>
void recursive_function(int k)
{
........
recursive_function(...);
}
int main()
{
omp_set_nested(1);
#pragma omp parallel for num_threads(4)
for(i=0;i< width * height;i++)
{
#pragma omp critical
{
......
// 3 simple instructions
}
if(i!=0)
{
recursive_function(i);
}
else
{
int j;
#pragma omp parallel for num_threads(4)
for(j=i;j< width * height;j++)
{
recursive_function(j);
}
}
}
}
使用gcc和选项-fopenmp
执行答案 0 :(得分:2)
您是否尝试过设置GOMP_CPU_AFFINITY?
可能是调度程序无法正常工作。
编辑:根据Haralds评论改为GOMP_CPU_AFFINITY。他也提供了一个链接。
答案 1 :(得分:1)
请注意,您仅进入i==0
的嵌套区域。
这意味着外部循环由4个线程的团队执行(称之为T1)。每当来自T1的线程执行迭代i=0
(让我们调用该线程TH1)时,TH1将进入else
,然后它将创建一个具有4个线程的团队的并行区域(称为T2) 。此时,团队T1有3个剩余的线程执行i!=0
和团队T2有4个线程(包括TH1)执行最里面的并行区域的情况。总计最多7个线程。
关于线程处于空闲状态,这完全取决于他们必须执行的工作 - 即recursive_function()
。