【问题标题】:Which is faster in CUDA: Constant Memory or Texture Memory?CUDA 中哪个更快:常量内存或纹理内存?
【发布时间】:2012-07-13 21:31:05
【问题描述】:

我知道两者都在片外 DRAM 上并缓存。

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

【问题讨论】:

    标签: cuda


    【解决方案1】:

    纹理内存针对 2D 空间局部性进行了优化(它的名字来自哪里)。您可以将恒定记忆视为利用了临时性的局部性。

    纹理内存相对于常量内存的好处可以总结如下:

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

    有关详细信息,请参阅documentation

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        根据我的经验,访问纹理内存与访问常量内存一样快。但是纹理内存比常量内存大得多,所以如果你需要存储大量数据,我建议多次使用纹理内存而不是'memcpy'到常量内存中。另外,如果你需要做插值,纹理内存是最好的选择。

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

        【讨论】:

          猜你喜欢
          • 2012-01-08
          • 2012-07-11
          • 2013-01-11
          • 2018-05-23
          • 2012-06-30
          • 1970-01-01
          • 2011-10-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多