如果线程之间的数据请求频率非常高(每个线程从特定列中选取至少一个数据),那么在 Pascal 架构中使用常量内存中的数据存储是否比纹理有任何好处?
编辑:这是一个拆分版本这个问题改善社区搜索
如果满足对恒定内存使用的期望,则在一般情况下使用恒定内存是一个好主意。它允许您的代码利用 GPU 硬件提供的额外缓存机制,从而减轻代码其他部分使用纹理的压力.
由于常量内存及其缓存,就像纹理和表面内存及其自己的缓存一样,都是由硬件定义的计算能力,应考虑目标硬件。因此,恒定存储器和纹理存储器的选项取决于访问模式和高速缓存使用,以及高速缓存可用性。
恒定的内存性能与扭曲中线程之间的数据广播有关,因此如果所有线程请求完全相同的数据地址并且数据已经在缓存上,则可以实现最大性能。因此,如果在同一个 warp 中存在对多个地址的请求,则服务会分为多个请求,因为它每次操作都可以检索单个地址。如果由于从多个地址检索数据而导致的拆分请求数量过高,则在这种特定情况下,纹理和表面内存性能可能优于恒定内存。。此信息详细说明在Cuda编程指南:
常量内存空间驻留在设备内存中,并缓存在中提到的常量缓存中计算能力2.x.
然后,一个请求被分成尽可能多的单独请求
初始请求中不同的内存地址,递减
吞吐量的倍数等于单独请求的数量。
然后以吞吐量处理生成的请求
缓存命中或设备吞吐量时的恒定缓存
否则记忆。
纹理内存缓存比常量内存缓存更灵活。它可以利用同一地址扭曲中以 2D 方式靠近的读数。尽管与常量内存相比有一些优点,但一般来说,如果数据访问模式或数据大小不遵循常量内存要求或要使用纹理内存缓存,则应使用纹理内存。更详细的信息可以found at:
纹理和表面内存空间
驻留在设备内存中并缓存在纹理缓存中,因此纹理
获取或表面读取仅花费一次从设备内存读取的内存
缓存未命中,否则只需要从纹理缓存读取一次。这
纹理缓存针对 2D 空间局部性进行了优化,因此
读取接近的纹理或表面地址的相同扭曲
在 2D 中一起使用将实现最佳性能。此外,它还专为
具有恒定延迟的流式读取;缓存命中会减少 DRAM
带宽需求但不是获取延迟。
通过纹理或表面获取来读取设备内存呈现出一些
可以使其成为阅读的有利替代方案的好处
来自全局或常量内存的设备内存:
- 如果内存读取不遵循全局或
必须遵循持续的内存读取才能获得良好的性能,更高的性能
如果存在局部性,则可以实现带宽
纹理获取或表面读取;
- 寻址计算是
由专用单元在内核外部执行;
- 打包的数据可能是
在单个操作中广播到单独的变量;
- 8 位和
16 位整数输入数据可以选择转换为 32 位
[0.0, 1.0] 或 [-1.0, 1.0] 范围内的浮点值(请参阅纹理内存).
开发人员应该记住,利用纹理内存与常量内存的组合可能比单独使用纹理内存具有真正的优势,因为它可以允许利用两者的专用缓存,因为两个缓存都具有更高的性能比在缓存(即设备内存)之外检索的任何数据都要多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)