首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >openMP程序创建多个线程,但只在一个内核上执行

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

Stack Overflow用户
提问于 2014-10-23 20:12:50
回答 2查看 1.4K关注 0票数 0

我是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,因为它们完全处于空闲状态。

当我尝试另一个示例并行程序时,线程在内核上拆分得很好,所以我认为问题出在我的代码中:

代码语言:javascript
复制
#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选项

EN

回答 2

Stack Overflow用户

发布于 2016-08-10 14:28:22

你试过设置GOMP_CPU_AFFINITY吗?

可能是调度程序不能正常工作。

编辑:根据Haralds的评论更改为GOMP_CPU_AFFINITY。他也在那里提供了一个链接。

票数 2
EN

Stack Overflow用户

发布于 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()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26527785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档