Opencl 我应该如何查看全局和本地工作大小
出于爱好,我已经使用OpenCL有一段时间了。我想知道是否有人能解释我应该如何看待全球和本地工作空间。我已经玩了一段时间了,但我似乎不能把我的头围绕着它 我有这段代码,内核的全局工作大小为8,本地工作大小为4Opencl 我应该如何查看全局和本地工作大小,opencl,Opencl,出于爱好,我已经使用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} 我知道为什
__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个线程在运行?如果是这样的话,是什么让这4个人在当地工作特别呢
或者这意味着内核的主体只有两个计数器?一个来自本地,一个来自全球,但这有什么意义
我知道我可能有点含糊不清,我的问题可能看起来很愚蠢。但我不知道如何更好地使用它,以及如何看待它?- 全局大小是工作项的总数
- 工作组细分此总工作负载,本地大小定义了全局大小中每个组的大小
get\u global\u id(0)
对于每个线程都是不同的:0…7get\u local\u id(0)
将为每个组中的4个不同线程返回0…3。这是您在输出的索引0到7中看到的
这也意味着如果您的全局工作大小是8,那么内核将只设置bar
的前8项。因此,除此之外的任何内容(输出中索引8处的值4
)都是未定义的
这是否意味着有4个线程在本地工作,8个线程在全局工作,所以我总共有4*8个线程在运行?如果是这样的话,是什么让这4个人在当地工作特别呢
你想得太多了。总共有8个线程。它们分为两组,每组4条螺纹。这些组中线程的“本地”是指它们共享对相同local
内存的访问。不在同一组中的线程只能通过全局内存“通信”
使用本地内存可以极大地提高某些工作负载的效率:
- 它非常快
- 工作组中的线程可以使用屏障来确保它们处于锁定状态,也就是说,它们可以互相等待以确保另一个线程已写入特定的
内存位置。(不同组中的线程不能相互等待。)本地
- 本地内存很小(通常只有几KiB),在一个组中使用所有内存通常会进一步降低效率
- 本地内存必须由内核内的数据填充,当内核完成时,其内容将丢失。(OpenCL 2中的设备调度内核除外)
- 由于硬件限制,组大小受到严格限制