GPGPU线程策略

问题描述

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

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

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

哪种方式更好:

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

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)