我已经有一段时间将opencl用于业余爱好了。我想知道是否有人可以解释我应该如何查看全球和本地工作空间。我已经玩了一段时间,但似乎无法绕开它。
我有这段代码,内核的全局工作大小为8,本地工作大小为4
__kernel void foo(__global int *bar)
{
bar[get_global_id(0)] = get_local_id(0);
}
此结果栏显示如下:
{0, 1, 2, 3, 0, 1, 2, 3, 4}
我知道为什么会这样,因为我使用的工作量很大。但是我似乎无法围绕我应该如何看待这个问题。
这是否意味着有4个线程在本地工作并且有8个全局在工作,所以我总共有4 * 8个线程在运行?如果是这样的话,那这四个在当地工作的特殊之处是什么?
或者这是否意味着内核主体只有两个计数器?一个来自本地,一个来自全球,但是这有什么意义呢?
我知道我可能有点含糊,我的问题似乎很愚蠢。但是我不知道如何才能更好地使用它以及应该如何查看?
get_global_id(0)
将不同:0…7。 get_local_id(0)
将为每个组中的4个不同的线程返回0…3。这就是您在输出的索引0到7中看到的内容。这也意味着,如果您的全局工作大小为8,则内核只会设置bar
的前8个项目。因此,超出此范围的所有内容(输出中索引8的4
值都不确定)。
这是否意味着有4个线程在本地工作并且有8个全局在工作,所以我总共有4 * 8个线程在运行?如果是这样的话,那这四个在当地工作的特殊之处是什么?
您想得太多。共有8个线程。它们分为2组,每组4个线程。这些组中的线程的“本地”含义是它们共享对相同local
内存的访问。不在同一组中的线程只能通过全局内存“通信”。