更改线程号不会影响代码

changing thread number doesn't affect code

我正在尝试学习 xeon-phi,在学习 Intel Xeon-Phi Coprocessor HPC 书籍时,我尝试 运行 代码 here。 (来自书本)

该代码使用 openmp 和 2 个线程。

但是我得到的结果和运行 1个线程一样。 (完全没有使用 openmp)

我什至在麦克风中使用了不同的组合,但仍然是一样的:

export OMP_NUM_THREADS=2
export MIC_OMP_NUM_THREADS=124
export MIC_ENV_PREFIX=MIC

似乎不​​知何故没有启用 openmp?我在这里遗漏了什么吗?

仅使用 1 个线程的代码是 here

我编译使用:

icc -mmic -openmp -qopt-report -O3 hello.c

谢谢!

我不确定你说的是哪本书,但也许这会有所帮助。

您显示的代码不使用卸载编程风格,并且必须 运行 原生在协处理器上,这意味着您将可执行文件复制到协处理器并 运行 它在那里,或者您使用micnativeloadex 实用程序 运行 来自主机处理器的代码。你表明你知道代码必须是 运行 本机的,因为你使用 -mmic 选项编译它。

如果您使用 micnativeloadex,那么协处理器上的 omp 线程数是通过在主机上执行 "export MIC_OMP_NUM_THREADS=124" 来设置的。如果将可执行文件复制到协处理器,然后在那里登录 运行,则协处理器上的 omp 线程数是通过在协处理器上执行 "export OMP_NUM_THREADS=124" 来设置的。如果你在协处理器上使用 "export OMP_NUM_THREADS=2",你只会得到两个线程;如果直接在协处理器上设置 MIC_OMP_NUM_THREADS 环境变量,则不会使用它。

我在代码中没有看到任何打印线程数的地方,所以我不确定您是如何确定实际使用的线程数的。我怀疑您使用的是像 micsmc 这样的工具。然而,micsmc 告诉您使用了多少个内核,而不是使用了多少个线程。

默认情况下,omp 线程按顺序排列,因此第一个核心 运行 线程 0,1,2,3,第二个核心 运行 线程 4,5 ,6,7 等等。如果您只使用两个线程,则两个线程都将在第一个核心上 运行。

那么,这就是您所看到的 - 不是您只使用了一个线程,而是您只使用了一个核心?

我正在查看您正在使用的代码的串行版本。对于以下行:

        for(j=0; j<MAXFLOPS_ITERS; j++)  
        {
        //
        // scale 1st array and add in the 2nd array
        // example usage - y = mx + b;
        //
            for(k=0; k<LOOP_COUNT; k++)  
            {
                fa[k] = a * fa[k] + fb[k];
            }
         }

我看到这里你没有扫描完整的数组。相反,您继续更新数组 Fa 的前 128 (LOOP_COUNT) 个元素。如果您想将此串行版本与您所指的并行代码进行比较,则必须确保该程序在两个版本中执行相同数量的工作。

谢谢

我在您的第一个程序 omp 中注意到三件事:

  1. 浮点运算总数应反映执行该工作的线程数。因此,

gflops = (double)( 1.0e-9*LOOP_COUNTMAXFLOPS_ITERSFLOPSPERCALC*numthreads);

  1. 你硬编码线程数=2。如果你想使用OMP环境变量,你应该注释掉API "omp_set_num_threads(2);"

  2. 将二进制文件传输到协处理器后,要在协处理器中设置 OMP env 变量,请使用 OMP_NUM_THREADS,而不是 MIC_OMP_NUM_THREADS。例如,如果您希望 64 个线程 运行 您在协处理器中的程序:

% ssh mic0

%出口OMP_NUM_THREADS=64