更改线程号不会影响代码
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 中注意到三件事:
- 浮点运算总数应反映执行该工作的线程数。因此,
gflops = (double)( 1.0e-9*LOOP_COUNTMAXFLOPS_ITERSFLOPSPERCALC*numthreads);
你硬编码线程数=2。如果你想使用OMP环境变量,你应该注释掉API "omp_set_num_threads(2);"
将二进制文件传输到协处理器后,要在协处理器中设置 OMP env 变量,请使用 OMP_NUM_THREADS,而不是 MIC_OMP_NUM_THREADS。例如,如果您希望 64 个线程 运行 您在协处理器中的程序:
% ssh mic0
%出口OMP_NUM_THREADS=64
我正在尝试学习 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 中注意到三件事:
- 浮点运算总数应反映执行该工作的线程数。因此,
gflops = (double)( 1.0e-9*LOOP_COUNTMAXFLOPS_ITERSFLOPSPERCALC*numthreads);
你硬编码线程数=2。如果你想使用OMP环境变量,你应该注释掉API "omp_set_num_threads(2);"
将二进制文件传输到协处理器后,要在协处理器中设置 OMP env 变量,请使用 OMP_NUM_THREADS,而不是 MIC_OMP_NUM_THREADS。例如,如果您希望 64 个线程 运行 您在协处理器中的程序:
% ssh mic0
%出口OMP_NUM_THREADS=64