2

如果线程之间的数据请求频率非常高(每个线程从特定列中选择至少一个数据),那么使用常量内存中的数据存储是否比 Pascal 架构中的纹理有任何好处?

编辑:这是这个问题的拆分版本,以改善社区搜索

4

1 回答 1

3

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

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

恒定的内存性能与 warp 中线程之间的数据广播有关,因此如果所有线程都请求相同的数据地址并且数据已经在缓存中,则可以实现最大性能。因此,如果在同一个 warp 中存在对多个地址的请求,则服务将拆分为多个请求,因为它可以在每个操作中检索单个地址。如果由于从多个地址检索数据而导致的拆分请求数量过多,则在这种特定情况下,纹理和表面内存性能可能优于常量内存。. 此信息在Cuda 编程指南中有详细说明:

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

然后,一个请求被拆分为与初始请求中不同的内存地址一样多的单独请求,从而将吞吐量降低等于单独请求数量的因子。

然后在缓存命中的情况下以常量缓存的吞吐量为结果请求提供服务,否则以设备内存的吞吐量提供服务。

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

纹理和表面内存空间驻留在设备内存中并缓存在纹理缓存中,因此纹理提取或表面读取仅在缓存未命中时从设备内存读取一次内存,否则只需从纹理缓存读取一次。纹理缓存针对 2D 空间局部性进行了优化,因此读取 2D 中靠近在一起的纹理或表面地址的同一 warp 的线程将获得最佳性能。此外,它专为具有恒定延迟的流式提取而设计;缓存命中会降低 DRAM 带宽需求,但不会降低获取延迟。

通过纹理或表面提取读取设备内存具有一些优势,可以使其成为从全局或常量内存读取设备内存的有利替代方案:

  • 如果内存读取不遵循全局或常量内存读取必须遵循以获得良好性能的访问模式,则可以实现更高的带宽,前提是纹理提取或表面读取中存在局部性;
  • 寻址计算由专用单元在内核外部执行;
  • 打包的数据可以在单个操作中广播到单独的变量;
  • 8 位和 16 位整数输入数据可以选择转换为 [0.0, 1.0] 或 [-1.0, 1.0] 范围内的 32 位浮点值(请参阅 纹理内存)。

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

于 2017-09-19T01:30:11.363 回答