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内存中。具体语法后面再详细介绍。
下面以向量加为例说明:
- #include
- #include
- #include
- #define N 200000
- __attribute__((target(mic)))
- void VecAdd_mic(float* A, float* B, float* C, int size)
- {
- #pragma omp parallel for
- for(int i=0;i
- C[i] = A[i] + B[i];
- }
- int main( int argc, char** argv)
- {
- int i;
- int size = N * sizeof(float);
- float *A,*B,*C;
- A = (float*)malloc(size);
- B = (float*)malloc(size);
- C = (float*)malloc(size);
- srand(2013);
- for(i=0;i
- {
- A[i]=rand()%10;
- B[i]=rand()%10;
- }
- #pragma offload target(mic) in(A,B: length(N)) out(C: length(N))
- {
- VecAdd_mic(A, B, C, N);
- }
- for(i=0;i
- {
- printf("%6d: %4.2f + %4.2f = %4.2f\n",i,A[i],B[i],C[i]);
- }
- free(A);
- free(B);
- free(C);
- }
编译:icpc -O3 -openmp -o vectoradd_mic_offload vectoradd_mic_offload.cpp
运行:./vectoradd_mic_offload