我想提高计算着色器的性能。
shader的每个线程组需要8个数据块,每个数据块有24个元素。
我主要针对我的开发 PC 中的 GeForce 1080Ti 和生产服务器中的 Tesla V100 进行优化,但其他人也在他们的工作站上运行此代码,GPU 各不相同,不一定是 nVidia。
哪种方式更好:
[numthreads( 24, 1, 1 )]
,写一个循环for( uint i = 0; i < 8; i++ )
这在每个warp中浪费了25%的执行单元,但是内存访问模式很棒。这 24 个活动线程的 VRAM 读取要么合并,要么完全广播。[numthreads( 96, 1, 1 )]
, write a loopfor( uint i = groupThreadID / 24; i < 8; i += 4 )
在执行单元利用率方面看起来更好,但是 VRAM 访问模式变得更糟,因为每个 warp 正在读取 2 个输入数据切片。
我也担心GroupMemoryBarrierWithGroupSync()
内在的同步损失,组共享内存会分成 3 个扭曲。
实施起来也有点困难。