MIC C编程(offload模式)
编程特点
简单---隐藏大量细节,语法与OpenMPI类似(不需要开辟空间)
灵活---OpenMP MPI(但是用的不多)pThread等多种方式
传统---与CPU编程一脉相承
MIC C扩展语言结构
编译指导方式(#pragma)
offload
--表示之后的代码段将使用offload模式运行
运行在其他设备上(MIC)
--标识内存传递参数,传递过程对用户透明
不需要手动写代码控制何时传入、何时传出
不需要手动申请卡上内存空间
不需要讲卡上内存与主机端内存空间手动对应
简单示例
#pragma offload target(mic)
for(i=0;i<LEN;i++)
{
printf(“Index:%d\n”,i);
}
循环和printf语句在MIC上执行,没有数据传输
此时循环是串行的,因为没有并行引语
offload语法
#pragma offload specifier[,specifier...]
specifier |
示例 |
含义 |
target |
target(mic:0) |
使用什么设备运行 |
if |
if(N>1000) |
是否使用该设备 |
in |
in(p:length(LEN) alloc_if(1)) |
数据传入device |
out |
out(p:length(LEN)) |
数据从device传出 |
inout |
inout(p:length(LEN) align(8)) |
数据既传入又传出 |
nocopy |
nocopy(p) |
只开辟空间不传递 |
signal |
signal(tag) |
发送信号 |
wait |
wait(tag1,tag2) |
等待信号 |
mandatory |
mandatory |
必须用MIC运行 |
其中in/out/inout/nocopy可用的属性有
属性 |
示例 |
含义 |
length |
length(LEN) |
元素个数 |
alloc_if |
alloc_if(1) |
是否开辟内存 |
free_if |
free_if(N>0) |
offload后是否释放 |
align |
align(8) |
对齐 |
alloc |
alloc(p[10:100]) |
开辟数组一部分 |
into |
into(p[10:100]) |
传递数组一部分 |
语法详解target
#pragma offload target(mic) mic这里目前只支持MIC卡
--这是必须使用的属性
--表示下面的代码段使用M