我是对的,来自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/
答案 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 =每组的工作项数)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
来阻止我们使用基元(或它们的向量类型)推测合并的内存访问,所以我会使用任何看似有用的事件处理版本。