gpt4 book ai didi

opencl - 我应该如何查看全局和本地的工作规模

转载 作者:行者123 更新时间:2023-12-04 09:40:45 26 4
gpt4 key购买 nike

我出于业余爱好使用 OpenCL 已经有一段时间了。我想知道是否有人可以解释我应该如何查看全局和本地工作空间。我一直在玩它,但我似乎无法围绕它。

我有这段代码,内核的全局工作大小为 8,本地工作大小为 4

    __kernel void foo(__global int *bar)
{
bar[get_global_id(0)] = get_local_id(0);
}

bar 中的结果如下所示:
{0, 1, 2, 3, 0, 1, 2, 3, 4}
我知道为什么会发生这种情况,因为我使用过的工作规模。但我似乎无法理解我应该如何看待这一点。

这是否意味着有 4 个本地线程和 8 个全局线程在运行,所以我总共有 4 * 8 个线程在运行?如果是这样,那 4 个在本地工作的人有什么特别之处?

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

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

最佳答案

  • 全局大小为 总计 工作项目的数量。
  • 工作组分割这个总工作量,本地大小定义了每个组的大小全局规模。

  • 因此,对于 8 个全局工作大小和 4 个局部大小,每个在 1 维中,您将有 2 个组。您的 get_global_id(0)每个线程都会不同:0…7。 get_local_id(0)将为每个组中的 4 个不同线程返回 0…3。这就是您在输出的索引 0 到 7 中看到的内容。

    这也意味着,如果您的全局工作大小为 8,则只有 bar 的前 8 项。将由您的内核设置。因此,除此之外的任何内容(输出中索引 8 处的值 4)都是未定义的。

    Does this mean that there are 4 threads working locally and 8 globally so i have 4 * 8 threads running in total? and if so what makes those 4 working locally special?



    你多虑了。共有 8 个线程。它们被分割为 2 组,每组 4 个线程。这些组中的线程的“本地”之处在于它们共享对同一 local 的访问。内存。不在同一组中的线程只能通过全局内存进行“通信”。

    使用本地内存可以极大地提高某些工作负载的效率:
  • 它是 非常快速地。
  • 工作组中的线程可以使用屏障来确保它们处于锁步状态,即它们可以相互等待以保证另一个线程已写入特定的 local内存位置。 (不同组的线程不能互相等待。)

  • 但:
  • 本地内存很小(通常为几 KiB) - 在一组中使用所有内存通常会进一步降低效率。
  • 本地内存必须填充内核内部的数据,内核完成时其内容丢失。 (OpenCL 2 中的设备调度内核除外)
  • 由于硬件限制,组大小受到严格限制。

  • 因此,如果您不使用本地内存,工作组以及本地工作大小基本上与您无关。

    关于opencl - 我应该如何查看全局和本地的工作规模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62344421/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com