我正在测试一个带有三个Intel Xeon Phi卡的节点。我的 想法是使用OpenMP 4.0指令卸载任务 协处理器。代码如下(取自http://goo.gl/9Ztq0e):
/***************************************************************************************************
* FILE : openmp4x-reduce-1Darray.c
*
* INPUT : Nil
*
* OUTPUT : Displays Host and device reduce sum
*
* CREATED : August,2013
*
* EMAIL : hpcfte@cdac.in
*
***************************************************************************************************/
#include <stdio.h>
#define SIZE 10000
#pragma omp declare target
int reduce(int *inarray)
{
int sum = 0;
#pragma omp target map(inarray[0:SIZE]) map(sum)
{
for(int i=0;i<SIZE;i++)
sum += inarray[i];
}
return sum;
}
int main()
{
int inarray[SIZE], sum, validSum;
validSum=0;
for(int i=0; i<SIZE; i++){
inarray[i]=i;
validSum+=i;
}
sum=0;
sum = reduce(inarray);
printf("sum reduction = %d,validSum=%d\n",sum, validSum);
}
我用intel / 16.0.1.150编译器编译它(我在英特尔网站上看到了 这个编译器支持OpenMP 4.0,也许我错了)。除此之外 我使用了变量:
export MIC_ENV_PREFIX=MIC
export MIC_OMP_NUM_THREADS=240
export MIC_KMP_AFFINITY=granularity=fine,compact
icc -openmp -std=c99 -qopt-report2 openmp_4.0_reduce_1Darray.c -o exec
问题是当我运行代码时,我使用micsmc-gui(图形界面)来查看协处理器上核心的性能。我是什么 不明白为什么每个协处理器上似乎只使用一个核心 与我在MIC上使用的线程数无关,请参阅红色矩形 在图中的每个MIC上。
有什么建议吗?
感谢。
答案 0 :(得分:1)
您尚未指定任何并行指令,因此循环是顺序的。 尝试添加一个openmp parrallel指令,以便在MIC的多个核心上分配循环的迭代
int reduce(int *inarray)
{
int sum = 0;
#pragma omp target map(inarray[0:SIZE]) map(sum)
{
#pragma omp parallel for reduction(+:sum)
for(int i=0;i<SIZE;i++)
sum += inarray[i];
}
return sum;
}