我正在尝试学习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
谢谢!
答案 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中发现了三件事:
gflops =(double)(1.0e-9 * LOOP_COUNT MAXFLOPS_ITERS FLOPSPERCALC * numthreads);
您为代码提供了线程数= 2。如果您想使用OMP env变量,您应该注释掉API“omp_set_num_threads(2);”
将二进制文件传输到协处理器后,要在协处理器中设置OMP env变量,请使用OMP_NUM_THREADS,而不是MIC_OMP_NUM_THREADS。例如,如果您希望64个线程在协处理器中运行您的程序:
%ssh mic0
%export OMP_NUM_THREADS = 64