MIC编程(7 )——offload语法

25 篇文章 0 订阅
13 篇文章 1 订阅

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 <stdio.h>
  2. #include <stdlib.h>
  3. #include <omp.h>

  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<size;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<N;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<N;i+=10000)
  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


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值