在CUDA中,哪个更快: 常量内存还是纹理内存?

8

我知道它们都可以使用离片DRAM和缓存。

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

3个回答

12

常量内存优化了广播,即当warp中的线程都读取同一内存位置时。如果它们读取不同的位置,也可以工作,但每个warp所引用的不同位置的成本更高。当一个读取正在被广播到线程时,常量内存比纹理内存要快得多。

纹理内存具有较高的延迟,即使对于缓存命中也是如此。你可以将其视为带宽聚合器 - 如果可以通过纹理缓存服务于重用,则GPU不必为这些读取访问外部内存。对于2D和3D纹理,寻址具有2D和3D局部性,因此缓存行填充会拉入2D和3D内存块而不是行。

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


10

纹理内存被优化用于2D空间局部性(它的名称也由此而来)。您可以将常量内存视为利用时间局部性的方式。

与常量内存相比,纹理内存的优势可以概括如下:

  • 空间局部性
  • 寻址计算可以在硬件中的内核外进行计算
  • 单次操作可以让不同变量访问数据
  • 8位和16位数据可以自动转换为0到1.0之间的浮点数

有关更多详细信息,请参见文档


0

根据我的经验,访问纹理内存的速度与访问常量内存的速度一样快。但是纹理内存比常量内存大得多,因此如果您需要存储大块数据,我建议使用纹理内存而不是多次将其复制到常量内存中。此外,如果您需要进行插值,纹理内存是最佳选择。

另一方面,常量内存针对所有线程都从同一位置读取的情况进行了硬件优化。如果线程从多个位置读取,则访问会被串行化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接