GPU优化内存调度时的几个原则

最小化内存访问

  1. 减少浪费。比如,当你只需要单通道贴图的时候,不要使用多通道贴图;16bit就可以的时候,不要用32bit;
  2. 避免重复访问。比如,在做一些全屏后效的时候,你所需要的数据可能隔壁线程里面就有。如果你所使用的GPU支持从隔壁偷数据的话,大胆的用;
  3. 用计算代替内存访问。比如一些LUT表格当中的数据,是可以通过计算得到的。在某些情况下(比如为内存访问瓶颈的时候),可能直接计算比使用LUT在总体上效率更高;
  4. 采用压缩。如果你所使用的GPU支持对压缩数据的直接访问,那么使用它。这可以显著减少所需的内存访问带宽;
  5. 使用片上存储空间。现代GPU一般都有一定的片上存储空间。你可以将一些会被频繁访问的数据事先调入这个空间,从而减少对内存的访问;
  6. 采用缓存友好的算法。和CPU一样,GPU内部也有多级高速缓存结构。尽可能避免大范围随机读写,提升缓存命中率,可大大减少对内存读写的带宽。

最大化运算并行

  1. 减少算法复杂度。与CPU不同,GPU当中的寄存器是在Shader执行之前一次性分配好的,在Shader执行期间无法动态调整。因此,减少算法的复杂度可以减少对寄存器的开销,从而允许更多的并行处理;
  2. 减少资源绑定点。资源绑定通常是通过一组被称为标量寄存器的东西来实现的。它们同样是有限的资源。过度开销会使得并行度降低;
  3. 减少对片上存储资源的开销。片上存储资源同样是十分有限的。如果单一线程对片上资源的开销大,那么可以同时执行的线程个数,也就是并行度会降低;
  4. 避免过于简单的算法。过于简单的算法会在很短的时间内执行完毕,而GPU对工作量的分配本身是需要时间的。所以如果Shader执行时间过短,则GPU可能无法及时生成足够的任务量来填充管道,从而造成并行度下降。当算法过于简单的时候,可以考虑将多个处理并在一起;
  5. 避免过于复杂的算法。过于复杂的算法会长时间独占GPU的关键资源,导致其它工作量难以填充。当算法过于复杂的时候,可以考虑将其拆分为多个步骤分别处理;

用并行运算的吞吐量弥补内存访问延迟

  1. 平衡有序利用GPU上的共享资源。一般商用GPU出于成本等考虑,诸如贴图单元、缓存、RB等都会被多个核心共享。保持与硬件设计相同比例的工作量,平衡有序使用这些硬件模块和功能,是高性能的关键。
  2. 将计算隐藏到等待内存读写的区间中。一般来说Shader的编译器会自动为你完成这方面的优化。但是,这也意味着更多的寄存器需要长时间等待数据而无法被同一shader当中的其它代码复用。从而在结果上可能降低并行度,使得GPU并没有充足的工作量可以在等待期间执行。这个平衡的调整往往需要手工进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值