2016-02-02 73 views
0

我正在測試一個包含三個Intel Xeon Phi卡的節點。我的 的想法是使用OpenMP 4.0指令來卸載協處理器上的任務 。代碼如下(它是從http://goo.gl/9Ztq0e取):卸載OpenMP 4.0的指令

/*************************************************************************************************** 
* FILE   : openmp4x-reduce-1Darray.c 
* 
* INPUT   : Nil 
* 
* OUTPUT  : Displays Host and device reduce sum 
* 
* CREATED  : August,2013 
* 
* EMAIL   : [email protected] 
* 
***************************************************************************************************/ 

#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); 
} 

我與英特爾/ 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

什麼建議嗎?

謝謝。

+4

這是可以預料的。代碼中沒有工作共享構造,因此它在協處理器上串行運行。 –

回答

1

您尚未指定任何並行指令,因此循環是順序的。 嘗試以分佈在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; 
    } 

一些基本的文檔的muliple核心的循環迭代添加OpenMP的parrallel指令: https://computing.llnl.gov/tutorials/openMP/#DO