首页 文章

OpenMP 4.0的卸载指令

提问于
浏览
0

我正在测试一个带有三个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的红色矩形 .

performance of MICs

有什么建议吗?

谢谢 .

1 回答

  • 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;
        }
    

    一些基本文档:https://computing.llnl.gov/tutorials/openMP/#DO

相关问题