问题描述
我想提高计算着色器的性能。
着色器的每个线程组需要8个数据块,每个数据块有24个元素。
我主要针对开发 PC 中的 GeForce 1080Ti 和生产服务器中的 Tesla V100 进行优化,但其他人也在他们的工作站上运行此代码,GPU 各不相同,不一定是 nVidia。
哪种方式更好:
-
[numthreads( 24,1,1 )]
,写一个循环for( uint i = 0; i < 8; i++ )
这在每个扭曲中浪费了 25% 的执行单元,但内存访问模式很棒。这 24 个活动线程的 VRAM 读取要么合并,要么完整广播。 -
[numthreads( 96,1 )]
,写一个循环for( uint i = groupThreadID / 24; i < 8; i += 4 )
在执行单元利用率方面看起来更好,但是 VRAM 访问模式变得更糟,因为每个 warp 正在读取 2 个输入数据切片。
我也担心GroupMemoryBarrierWithGroupSync()
内在的同步惩罚,组共享内存被分成 3 个扭曲。
也有点难以实施。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)