更改线程数不会影响代码

时间:2015-03-27 13:06:49

标签: xeon-phi intel-mic

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

代码使用openmp和2个线程。

但我所采取的结果与使用1个线程的结果相同。 (根本没有使用openmp)

我甚至在mic中使用了不同的组合,但仍然是相同的:

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

谢谢!

3 个答案:

答案 0 :(得分: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,依此类推。如果您只使用两个线程,则两个线程都将在第一个核心上运行。

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

答案 1 :(得分: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)个元素。如果您希望将此序列版本与您所指的并行代码进行比较,则必须确保该程序在两个版本中执行相同的工作量。

由于

答案 2 :(得分:0)

我在你的第一个程序omp中发现了三件事:

  1. 总浮点运算应该反映执行工作的线程数。因此,
  2. gflops =(double)(1.0e-9 * LOOP_COUNT MAXFLOPS_ITERS FLOPSPERCALC * numthreads);

    1. 您为代码提供了线程数= 2。如果您想使用OMP env变量,您应该注释掉API“omp_set_num_threads(2);”

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

    3. %ssh mic0

      %export OMP_NUM_THREADS = 64