MIC编程(7 )——offload语法

MIC编程中最基本的语法就是offload语句,offload语句的作用为将程序和数据由CPU端传递到MIC端,并在MIC上执行,offload语法为:

C/C++: 
#pragma offload target(mic: id) in(...) out(...)

Fortran: 
!dec$ OFFLOAD  target(mic: id) in(...) out(...)
或:
!DIR$ OFFLOAD BEGIN  target(mic: id) in(...) out(...)
...
!DIR$ END OFFLOAD 


target指定在哪块卡上运行,id代表设备编号,如果id等于-1,系统将自动选择一块计算设备(现在来说只有MIC卡),如果没有符合要求的设备(如只有CPU),程序将退出并报错;如果id大于等于0,程序将offload到相应的id号mic上。

target(mic)不指定运行在哪块MIC卡上,这时程序会轮回的执行在不同的MIC卡上,如系统有两块MIC卡,第1次offload到mic0上执行,第2次offload到mic1上执行,第3次offload到mic0上执行,第4次offload到mic1上执行,.......


in()  out()代表数据传递方向,in为数据从CPU内存传递到MIC内存上,out为数据从MIC内存上回传到CPU内存中。具体语法后面再详细介绍。


下面以向量加为例说明:

  1. #include
  2. #include
  3. #include

  4. #define N 200000

  5. __attribute__((target(mic)))
  6. void VecAdd_mic(float* A, float* B, float* C, int size)
  7. {
  8. #pragma omp parallel for
  9.         for(int i=0;i
  10.                 C[i] = A[i] + B[i];
  11. }

  12. int main( int argc, char** argv)
  13. {
  14.     int i;
  15.     int size = N * sizeof(float);

  16.     float *A,*B,*C;
  17.     A = (float*)malloc(size);
  18.     B = (float*)malloc(size);
  19.     C = (float*)malloc(size);

  20.     srand(2013);
  21.     for(i=0;i
  22.     {
  23.         A[i]=rand()%10;
  24.         B[i]=rand()%10;
  25.     }

  26. #pragma offload target(mic) in(A,B: length(N)) out(C: length(N))
  27.     {
  28.         VecAdd_mic(A, B, C, N);
  29.     }

  30.     for(i=0;i
  31.     {
  32.         printf("%6d: %4.2f + %4.2f = %4.2f\n",i,A[i],B[i],C[i]);
  33.     }

  34.     free(A);
  35.     free(B);
  36.     free(C);
  37. }
编译:icpc -O3 -openmp -o vectoradd_mic_offload vectoradd_mic_offload.cpp

运行:./vectoradd_mic_offload


你可能感兴趣的:(hpc,intel,xeon,phi,mic)