计算着色器在调用(线程)和工作组上的最佳数据划分

Compute shaders optimal data division on invocations (threads) and workgroups

据我从有关计算着色器计算 spaces 的 OpenGL 文档中了解到,我可以将数据 space 分成将并行执行的本地调用(线程)和包含以下内容的工作组:一些本地调用,它们将不会以随机顺序并行执行(?),我理解正确吗?主要问题是什么是划分数据的最佳策略,我是否应该始终尝试最大化本地调用大小并最小化工作组数量以获得更好的并行执行或任何其他策略会更好(例如我在数据缓冲区中有 10000 个元素( x 方向的速度可能)并且任何元素都可以独立计算,如何确定调用(线程)和工作组的最佳数量?

P.S。对于偶然发现这个问题的每个人,这里有一篇有趣的文章可供阅读,它可能会回答您的问题 https://gpuopen.com/learn/optimizing-gpu-occupancy-resource-usage-large-thread-groups/

https://www.opengl.org/registry/doc/glspec45.core.pdf

第 19 章:

A work group is a collection of shader invocations that execute the same code, potentially in parallel.

While the individual shader invocations within a work group are executed as a unit, work groups are executed completely independently and in unspecified order.

在多次阅读这些部分后,我发现 "best" 解决方案是最大化本地调用大小并最小化工作组数量,因为然后您告诉驱动程序忽略调用集独立的要求.更少的要求意味着平台在将您的意图解析为执行时的规则更少,这通常会产生更好(或相同)的结果。

An invocation within a work group may share data with other members of the same workgroup through shared variables (see section 4.3.8(“Shared Variables”) of the OpenGL Shading Language Specification) and issue memory and control barriers to synchronize with other members of the same work group

平台在编译着色器代码时可以导出调用之间的独立性。