计算着色器除了工作组之外还有局部大小还有什么意义?

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

有什么区别

void glDispatchCompute(1​, 1​, 1);
layout(local_size_x = 100​, local_size_y = 100​, local_size_z = 1​) in;  

void glDispatchCompute(100​, 100, 1);
layout(local_size_x = 1​, local_size_y = 1​, local_size_z = 1​) in;  

因为它们执行的调用总数相同。 我能看到的唯一区别是,从概念上讲,您有一个大型工作组,其中有 100x100 个调用可供调用,或者您有一个 100x100 个组的集合,对于每个组,您只需调用一次。但这仅仅是概念性的。对性能有真正的影响吗?

opengl gpgpu compute-shader
1个回答
0
投票

工作组大小和工作组数量之间的差异并不纯粹是概念上的。例如:

  • 同一工作组中的调用能够使用相同的
    shared
    内存。不同工作组中的调用不能直接共享数据
  • 障碍仅影响同一工作组中的调用。无法同步不同工作组中的调用。

性能可能会有所不同,具体取决于您的驱动程序如何将计算着色器调用映射到 GPU 的 SIMD 单元(32/64/... 单元,具体取决于 GPU)。同一工作组内的调用很可能实际上是并行执行的(最多可达单元数)。尽管我也见过 GPU 同时执行多个工作组,但来自不同工作组的调用不太可能按顺序执行。 OpenGL 标准无法保证调用如何映射到执行单元或扭曲,因此您计算机上使用的映射将在很大程度上取决于所使用的硬件和驱动程序。

为了使特定着色器获得最佳性能,您需要分析工作组大小和工作组数量的不同组合,但本文可能会为您提供有关如何确定大小的更多提示:

OpenGL 计算着色器映射到 nVidia 扭曲
计算着色器中哪种工作分配会带来更高的性能? (Reddit)
计算着色器是否并行化至本地工作组大小? (Reddit)

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