使用单个事件“分组”几个async_work_group_copy()调用

时间:2017-03-17 13:00:55

标签: multithreading parallel-processing opencl gpgpu

我是对的,来自OpenCL 1.1标准的以下引用( 6.11.10 部分)

  

事件参数也可用于关联   async_work_group_copy与先前的异步副本允许事件发生   由多个异步副本共享;

表示我可以使用单个事件“分组”多个async_work_group_copy()个来电,仅使用该事件等待整个群组完成复制操作?

备注:好像,以下博文中using_local()内核的代码片段正是如此? https://streamcomputing.eu/blog/2014-06-19/using-async_work_group_copy-on-2d-data/

1 个答案:

答案 0 :(得分:2)

在Intel iGPU上,

// tmp-store
// tmp2-compute
// tmp3-load    
pipelineEvent[0]=async_work_group_copy(&b[g*gs],tmp,gs,pipelineEvent[0]);
pipelineEvent[0]=async_work_group_copy(tmp3,&e[g*gs],gs,pipelineEvent[0]);
tmp2[l]=tmp2[l]+3;
wait_group_events(1,&pipelineEvent[0]);

给出与

相同的延迟相同的输出
// tmp-store
// tmp2-compute
// tmp3-load    
pipelineEvent[0]=async_work_group_copy(&b[g*gs],tmp,gs,0);
pipelineEvent[1]=async_work_group_copy(tmp3,&e[g*gs],gs,0);
tmp2[l]=tmp2[l]+3;
wait_group_events(2,&pipelineEvent[0]);

因此规范必须正确“由多个异步副本共享”。

也许event_t里面有一个计数器。那么也许

  • async_work_group_copy将其递增1(或N =每组的工作项数)
  • 当异步完成时,调度程序将计数器递减1(或每个工作项递减1)
  • wait_group_events检查是否为零

所以如果一个人使用90个事件或单个事件(并且不会推测更多)并不重要。

但如果有人接近“可以用来联系”部分,那么推测

如果实施只是交错指令来执行“异步”:

multiple events for multiple async copies
copy1 calculate copy2 calculate copy1 calculate copy2 calculate copy1

single event for multiple async copies(grouped copies)
copy1 copy2 calculate copy1 copy2 calculate copy1 copy2 calculate
当副本被分组并检查(完成)一次而不是每次异步迭代两次时,

等待障碍可能会更精细。

如果实现复制并发异步(例如在使用SIMD管道进行计算时使用标量管道进行复制,NCU例如在每个计算单元中具有2xScalar单位和30xSIMD单位):

multiple events for multiple copies
SIMD: compute compute compute compute
scalar-1: copy1 copy1 copy1 copy1
scalar-2: copy2 copy2 copy2 copy2

single event for multiple copies
SIMD: compute compute compute compute
scalar-1:copy1 copy2 copy1 copy2 copy1 copy2
scalar-2: copy1 copy2 copy1 copy2 copy1 copy2

然后多事件版本可能会更快,因为读取和写入是在不同的管道上独立完成的。

CPU,GPU,FPGA可以完全不同,并且支持async_work_group_copy来阻止我们使用基元(或它们的向量类型)推测合并的内存访问,所以我会使用任何看似有用的事件处理版本。