我是openMP的新用户,我在linux ubuntu13.10系统上有一个8核的inteli7-2670qm CPU。
我的程序使用C中的嵌套并行来创建8个线程的总和。据我所知,每个线程都应该在它自己的处理器上运行,但是当我在终端上运行命令top时,我看到我的程序只使用了100%的内存(预期是800%),在处理器视图中,只有CPUX使用了100% (X是0到7之间的随机数),其他CPUX是0.1%。
当我用Intel 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选项
发布于 2016-08-10 14:28:22
你试过设置GOMP_CPU_AFFINITY吗?
可能是调度程序不能正常工作。
编辑:根据Haralds的评论更改为GOMP_CPU_AFFINITY。他也在那里提供了一个链接。
发布于 2016-08-10 18:18:17
请注意,您进入的嵌套区域仅用于i==0。
这意味着外部循环是由4个线程组成的团队执行的(称之为T1)。每当来自T1的线程执行迭代i=0 (让我们称其为TH1)时,TH1将进入else,然后它将创建一个包含4个线程的并行区域(称为T2)。此时,team T1有3个剩余的线程执行i!=0和team T2有4个线程(包括TH1)执行最内层并行区域的情况。总共有7个线程。
至于线程是否空闲,这完全取决于它们必须执行的工作--即recursive_function()。
https://stackoverflow.com/questions/26527785
复制相似问题