什么时候纹理内存应该优先于常量内存?

时间:2017-09-19 01:30:11

标签: cuda gpu-constant-memory

如果线程中的数据请求频率非常高(每个线程从特定列中选择至少一个数据),那么在常量内存中使用数据存储是否会提供Pascal架构中的纹理优势?

编辑:这是this question的拆分版本,以改善社区搜索

1 个答案:

答案 0 :(得分:2)

如果满足对恒定内存使用的期望,在一般情况下使用常量内存是个好主意。它允许您的代码利用GPU硬件提供的额外缓存机制,这样就可以减少代码其他部分对纹理使用的压力

由于常量内存及其缓存,因为纹理和表面内存以及它自己的缓存是由硬件Compute Capability定义的,所以应该考虑目标硬件。因此,常量内存和纹理内存的选项取决于访问模式和缓存使用,作为缓存可用性。

常量内存性能与warp中线程之间的数据广播有关,因此如果所有线程都请求相同的数据地址并且数据已经在缓存中,则可以实现最大性能。因此,如果在相同的warp中存在对多个地址的请求,则该服务在多个请求中被分割,因为它可以在每个操作中检索单个地址。 如果由于从多个地址检索数据而导致的分割请求数太多,则纹理和表面内存性能可能优于常量内存(在此特定情况下)。。此信息详见Cuda Programming Guide

  

常量内存空间驻留在设备内存中,并缓存在Compute Capability 2.x中提到的常量缓存中。

     

然后将请求拆分为多个单独的请求   初始请求中的不同内存地址减少   吞吐量等于单独请求的数量。

     

然后,生成的请求以吞吐量的形式提供服务   在高速缓存命中或设备吞吐量的情况下持续高速缓存   记忆不然。

纹理内存缓存比常量内存缓存更灵活。它可以利用相同的地址扭曲中的读数,这些读数以2D方式靠近在一起。 尽管有一些优于常量内存的优点,但一般来说,如果数据访问模式或数据大小不符合常量内存要求或使用纹理内存缓存,则应使用纹理内存。更详细的信息可以是found at

  

纹理和表面存储空间   驻留在设备内存中并缓存在纹理缓存中,因此是一种纹理   获取或表面读取仅需要从设备存储器读取一个存储器   缓存未命中,否则只需从纹理缓存中读取一次。该   纹理缓存针对2D空间局部性进行了优化,因此线程也是如此   读取纹理或表面地址的相同扭曲   在2D中一起将实现最佳性能。此外,它是专为   具有恒定延迟的流式提取;缓存命中减少了DRAM   带宽需求但不是获取延迟。

     

通过纹理或表面提取来读取设备内存   可以使其成为阅读的有利替代品的好处   来自全局或常量内存的设备内存:

     
      
  • 如果内存读取不遵循全局或的访问模式   必须遵循恒定的内存读取才能获得更好的性能   只要有地方性,就可以实现带宽   纹理提取或表面读取;
  •   
  • 解决计算问题   由专门单位在内核之外执行;
  •   
  • 打包数据可能是   广播以在单个操作中分离变量;
  •   
  • 8位和   可选地,16位整数输入数据可以转换为32位   浮点值在[0.0,1.0]或[-1.0,1.0]范围内(见   Texture Memory)。
  •   

开发人员应该记住,利用纹理内存和常量内存的组合可以比单个内存的首选项更有优势,因为它可以允许利用两者的专用缓存,因为两个缓存都具有比在缓存外部检索的任何数据(即设备内存)更高的性能。