Opencl 我应该如何查看全局和本地工作大小

Opencl 我应该如何查看全局和本地工作大小,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} 我知道为什

出于爱好,我已经使用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个线程在运行?如果是这样的话,是什么让这4个人在当地工作特别呢

或者这意味着内核的主体只有两个计数器?一个来自本地,一个来自全球,但这有什么意义

我知道我可能有点含糊不清,我的问题可能看起来很愚蠢。但我不知道如何更好地使用它,以及如何看待它?

  • 全局大小是工作项的总数
  • 工作组细分此总工作负载,本地大小定义了全局大小中每个组的大小
因此,对于8的全局工作大小和4的局部大小,每个在1维中,您将有2个组。您的
get\u global\u id(0)
对于每个线程都是不同的:0…7
get\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中的设备调度内核除外)
  • 由于硬件限制,组大小受到严格限制
因此,如果您不使用本地内存,工作组和本地工作大小基本上与您无关