如何解决GPGPU线程策略
我想提高计算着色器的性能。
着色器的每个线程组需要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 举报,一经查实,本站将立刻删除。