0

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

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

但是我得到的结果与使用 1 个线程运行的结果相同。(根本不使用openmp)

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

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

似乎以某种方式未启用openmp?我在这里遗漏了什么吗?

仅使用 1 个线程的代码在这里

我编译使用:

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

谢谢!

4

3 回答 3

0

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

  1. 总的浮点运算应该反映做这项工作的线程数。所以,

gflops = (double)( 1.0e-9*LOOP_COUNT MAXFLOPS_ITERS FLOPSPERCALC*numthreads);

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

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

% ssh 麦克风0

% 导出 OMP_NUM_THREADS=64

于 2015-03-28T14:38:52.807 回答
0

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

您展示的代码不使用卸载编程风格,必须在协处理器上本地运行,这意味着您将可执行文件复制到协处理器并在那里运行,或者您使用 micnativeloadex 实用程序从主机处理器运行代码。您表明您知道代码必须在本机运行,因为您使用 -mmic 选项对其进行了编译。

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

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

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

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

于 2015-03-27T17:52:16.673 回答
0

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

        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) 个元素。如果您希望将此串行版本与您所指的并行代码进行比较,那么您必须确保程序在两个版本中执行相同数量的工作。

谢谢

于 2015-03-28T00:14:04.403 回答