在CUDA中哪个更快:恒定内存或纹理内存?

时间:2012-07-14 02:23:14

标签: cuda

我知道两者都是在片外DRAM上进行缓存的。

但访问速度更快?或者在什么情况下一个比另一个快?

3 个答案:

答案 0 :(得分:10)

纹理内存针对2D空间局部性进行了优化(从中获取其名称)。你可以把恒定的记忆想象成利用时间的地方。

纹理记忆优于常量记忆的好处可归纳如下:

  • 空间位置
  • 可以在硬件内核之外计算寻址计算
  • 可以通过单个操作中的不同变量访问数据
  • 8位和16位数据可以自动转换为0到1.0之间的浮点数

有关详细信息,请参阅documentation

答案 1 :(得分:9)

常量内存针对广播进行了优化,即当warp中的线程都读取相同的内存位置时。如果他们正在阅读不同的位置,它将起作用,但是经线引用的每个不同位置都会花费更多时间。当向线程广播读取时,常量内存比纹理内存快很多。

纹理内存具有高延迟,即使对于缓存命中也是如此。您可以将其视为带宽聚合器 - 如果可以从纹理高速缓存中进行重用,则GPU不必为外部存储器进行读取。对于2D和3D纹理,寻址具有2D和3D局部性,因此缓存行填充拉入2D和3D内存块而不是行。

最后,纹理管道可以执行“奖励”计算:处理边界条件(“纹理寻址”)并将8位和16位值转换为单位浮点数是可以“免费”完成的操作示例。 (它们是纹理读取具有高延迟的部分原因)

答案 2 :(得分:0)

根据我的经验,访问纹理内存与访问常量内存一样快。但是纹理内存比常量内存大得多,所以如果需要存储大量数据,我建议多次使用纹理内存而不是“memcpy”进入常量内存。此外,如果您需要进行插值,纹理存储器是最佳选择。

另一方面,常量内存是针对warp的所有线程读取相同位置的情况进行硬件优化的。如果线程从多个位置读取,则访问将被序列化。