【发布时间】:2013-03-10 20:43:17
【问题描述】:
我想了解如何在 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() 并忽略返回值吗?如果是这样,那可能会更快吗?
b.本地副本是否也适用于 CPU 上的处理,还是因为它们共享缓存而产生的开销?
问候, 斯蒂芬
【问题讨论】:
标签: opencl