【问题标题】:openMP program creates multiple threads but executes on only one coreopenMP 程序创建多个线程但仅在一个内核上执行
【发布时间】:2014-10-23 12:12:49
【问题描述】:

我是openMP的新用户,我在linux ubuntu 13.10系统上有一个8核的intel i7-2670QM CPU

我的程序使用 C 中的嵌套并行来创建 8 个线程的总和。据我了解,每个线程都应该在它自己的处理器上运行,但是当我在终端上运行命令top 时,我看到我的程序只使用了 100% 的内存(预计为 800%),并且在处理器视图中,只有 CPU[X] 使用 100%(X 在 0 到 7 之间随机),其他 CPU 使用 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 执行

【问题讨论】:

  • 您的处理器没有八个内核。它有四个核心和八个超线程(又名逻辑处理器)。
  • 好的,但即使程序应该使用整个处理器,而不仅仅是一个逻辑处理器
  • 你是对的。根据您提供的信息,我不知道是什么导致了您的问题。

标签: c linux multithreading openmp


【解决方案1】:

您是否尝试过设置 GOMP_CPU_AFFINITY?

可能是调度器工作不正常。

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

【讨论】:

  • KMP_AFFINITY 用于 Intel OpenMP 运行时,而不是 GNU 运行时。对于 GNU 运行时,您有 GOMP_CPU_AFFINITY
  • 感谢您指出这一点。我忘记了这个区别
【解决方案2】:

请注意,您进入嵌套区域仅为i==0

这意味着外循环由一组 ​​4 个线程(称为 T1)执行。每当来自 T1 的线程执行迭代 i=0(我们称之为线程 TH1)时,TH1 将进入 else,然后它将创建一个包含 4 个线程的并行区域(称之为 T2)。此时团队 T1 有 3 个剩余线程执行i!=0 和团队 T2 有 4 个线程(包括 TH1)执行最里面的并行区域的情况。总共有 7 个线程。

关于线程是否空闲,这完全取决于它们必须执行的工作——即recursive_function()

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多