我应该如何查看全球和本地工作规模

问题描述 投票:0回答:1

我已经有一段时间将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个线程在运行?如果是这样的话,那这四个在当地工作的特殊之处是什么?

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

我知道我可能有点含糊,我的问题似乎很愚蠢。但是我不知道如何才能更好地使用它以及应该如何查看?

opencl
1个回答
0
投票
  • 全局大小是工作项的数量[
  • 工作组将总工作量细分,本地规模定义了每个组的规模
  • 内部
  • 全局规模。
因此,对于8的全局作品大小和4的局部大小,每1维,您将有2个组。每个线程的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内存的访问。不在同一组中的线程只能通过全局内存“通信”。

© www.soinside.com 2019 - 2024. All rights reserved.