"Grouping" 多个 async_work_group_copy() 调用与单个事件
"Grouping" several async_work_group_copy() calls with a single event
我说得对吗,以下引用自 OpenCL 1.1 标准(第 6.11.10 节)
The event argument can also be used to associate the
async_work_group_copy with a previous async copy allowing an event to
be shared by multiple async copies;
意味着我可以 "group" 几个 async_work_group_copy()
调用一个事件并且 只使用该事件来等待整个组 复制操作完成?
备注:看起来,下面博文中 using_local()
内核的代码片段正是这样做的?
https://streamcomputing.eu/blog/2014-06-19/using-async_work_group_copy-on-2d-data/
在英特尔 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]);
所以规范一定是关于 "shared by multiple async copies" 的。
也许event_t
里面有一个计数器。那么也许
async_work_group_copy
将其递增 1(或递增 N=每组工作项数)
- 异步完成后,调度程序将计数器减 1(或每个工作项减 1)
wait_group_events
检查它是否为零
所以使用 90 个事件或单个事件都没有关系(并且不推测更多)。
但是如果有人接近规范中的 "can also be used to associate" 部分 推测 ,
如果一个实现只是 交错 指令来执行 "async":
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
以阻止我们使用基元(或其向量类型)推测合并内存访问,所以我会使用任何版本似乎有用的事件处理。
我说得对吗,以下引用自 OpenCL 1.1 标准(第 6.11.10 节)
The event argument can also be used to associate the async_work_group_copy with a previous async copy allowing an event to be shared by multiple async copies;
意味着我可以 "group" 几个 async_work_group_copy()
调用一个事件并且 只使用该事件来等待整个组 复制操作完成?
备注:看起来,下面博文中 using_local()
内核的代码片段正是这样做的?
https://streamcomputing.eu/blog/2014-06-19/using-async_work_group_copy-on-2d-data/
在英特尔 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]);
所以规范一定是关于 "shared by multiple async copies" 的。
也许event_t
里面有一个计数器。那么也许
async_work_group_copy
将其递增 1(或递增 N=每组工作项数)- 异步完成后,调度程序将计数器减 1(或每个工作项减 1)
wait_group_events
检查它是否为零
所以使用 90 个事件或单个事件都没有关系(并且不推测更多)。
但是如果有人接近规范中的 "can also be used to associate" 部分 推测 ,
如果一个实现只是 交错 指令来执行 "async":
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
以阻止我们使用基元(或其向量类型)推测合并内存访问,所以我会使用任何版本似乎有用的事件处理。