1

我想提高计算着色器的性能。

shader的每个线程组需要8个数据块,每个数据块有24个元素。

我主要针对我的开发 PC 中的 GeForce 1080Ti 和生产服务器中的 Tesla V100 进行优化,但其他人也在他们的工作站上运行此代码,GPU 各不相同,不一定是 nVidia。

哪种方式更好:

  1. [numthreads( 24, 1, 1 )],写一个循环for( uint i = 0; i < 8; i++ )
    这在每个warp中浪费了25%的执行单元,但是内存访问模式很棒。这 24 个活动线程的 VRAM 读取要么合并,要么完全广播。

  2. [numthreads( 96, 1, 1 )], write a loopfor( uint i = groupThreadID / 24; i < 8; i += 4 )
    在执行单元利用率方面看起来更好,但是 VRAM 访问模式变得更糟,因为每个 warp 正在读取 2 个输入数据切片。
    我也担心GroupMemoryBarrierWithGroupSync()内在的同步损失,组共享内存会分成 3 个扭曲。
    实施起来也有点困难。

4

0 回答 0