【问题标题】:changing thread number doesn't affect code更改线程号不会影响代码
【发布时间】:2015-03-27 13:06:49
【问题描述】:

我正在尝试学习 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

谢谢!

【问题讨论】:

    标签: xeon-phi intel-mic


    【解决方案1】:

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

    您展示的代码不使用卸载编程风格,必须在协处理器上本地运行,这意味着您将可执行文件复制到协处理器并在那里运行,或者您使用 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,依此类推。如果您只使用两个线程,则两个线程都将在第一个核心上运行。

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

    【讨论】:

      【解决方案2】:

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

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

      谢谢

      【讨论】:

        【解决方案3】:

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

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

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

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

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

        % ssh mic0

        % 导出 OMP_NUM_THREADS=64

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-14
          • 1970-01-01
          • 1970-01-01
          • 2018-12-16
          • 1970-01-01
          相关资源
          最近更新 更多