openMP程序创建多个线程,但只在一个核心上执行

时间:2014-10-23 12:12:50

标签: c linux multithreading openmp

我是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

执行

2 个答案:

答案 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()