我想了解如何在 OpenCL 中正确使用 async_work_group_copy() 调用。让我们看一个简化的例子:
__kernel void test(__global float *x) {
__local xcopy[GROUP_SIZE];
int globalid = get_global_id(0);
int localid = get_local_id(0);
event_t e = async_work_group_copy(xcopy, x+globalid-localid, GROUP_SIZE, 0);
wait_group_events(1, &e);
}
参考http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/async_work_group_copy.html说“从 src 到 dst 执行 num_elements gentype 元素的异步复制。异步复制由因此,工作组中的所有工作项和此内置函数必须由执行具有相同参数值的内核的工作组中的所有工作项遇到;否则结果未定义。”
但这并不能澄清我的问题......
我想知道,如果以下假设是正确的:
- 对 async_work_group_copy() 的调用必须由组中的所有工作项执行。
- 调用的方式应该是,所有工作项的源地址都相同,并指向要复制的内存区域的第一个元素。
- 因为我的源地址是相对的,基于工作组中第一个工作项的全局工作项 ID。所以我必须减去本地 id 以使所有工作项的地址都相同......
- 第三个参数真的是元素的数量(不是字节大小)吗?
奖励问题:
一个。我可以只使用 barrier(CLK_LOCAL_MEM_FENCE) 而不是 wait_group_events() 并忽略返回值吗?如果是这样,那可能会更快吗?
湾。本地副本对于在 CPU 上进行处理是否也有意义,还是因为它们共享缓存而产生的开销?
问候,斯特凡