码迷,mamicode.com
首页 > 其他好文 > 详细

MIC的异步传输

时间:2015-01-12 17:09:02      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

关于signal和wait,属于异步传输的语法,即CPU端无需等待offload语句返回,即可异步运行下面的代码。一般用于启动MIC代码段后,并发执行CPU代码,达到同步执行的目的。另外一种用法是使用offload_transfer和offload_wait语句,这两个语句与offload类似,但只负责数据传输,后面不加入计算代码。其中offload_transfer支持的参数与offload语句相同,offload_wait语句仅支持target,if,wait三个参数。两种用法的signal和wait的使用方法是相同的,signal语句在offload代码段结束后发送一个信号,wiat语句负责接收,所以二者一定是成对使用,但是wait语句可以一次等待多个信号,所以二者语句数量未必相等。signal和wait的参数tag,在C语言中,是传输的其中的一个数组的指针,即in/out/inout中的一个数组名,同时传输多个数组的时候,能且只能signal/wait一个数组名。例如:

 1 int counter;
 2 float *in1;
 3 counter=10000;
 4 __attribute__((target(mic))) mic_compute;
 5 cpu_cpmpute();
 6 while(counter>0){
 7 #pragma offload target(mic:0) signal(in1)
 8 {
 9     mic_compute();
10 }
11     cpu_compute();//此时函数与上面的MIC函数并发执行
12 #pragma offload_wait target(mic:0) wait(in)
13     counter--;
14 }

例子中定义了一个MIC计算函数mic_compute和一个CPU计算函数cpu_compute。当程序执行到offload语句时,MIC端执行mic_compute并将控制权交回CPU线程,CPU在得到控制权后,执行cpu_compute函数。cpu_compute函数执行完成后,执行offload_wait语句,offload_wait查看之前offload语句发出的signal信号是否已经到达,如果没有到达,则等待,否则继续执行下面的语句,即counter自减。

MIC语句offload中有if的用法,可以根据条件判断是否将该代码放到设备端运行。如果if中的表达式为假,则代码放到CPU端运行,否则放到MIC端运行。

#pragma offload target(mic)  if(N>1000)

意为当N>1000时使用MIC进行计算,否则使用CPU端进行计算。

MIC的异步传输

标签:

原文地址:http://www.cnblogs.com/sdxk/p/4216947.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!