我知道它们都可以使用离片DRAM和缓存。
但是哪个访问速度更快?或者在什么情况下,一个比另一个更快?
常量内存优化了广播,即当warp中的线程都读取同一内存位置时。如果它们读取不同的位置,也可以工作,但每个warp所引用的不同位置的成本更高。当一个读取正在被广播到线程时,常量内存比纹理内存要快得多。
纹理内存具有较高的延迟,即使对于缓存命中也是如此。你可以将其视为带宽聚合器 - 如果可以通过纹理缓存服务于重用,则GPU不必为这些读取访问外部内存。对于2D和3D纹理,寻址具有2D和3D局部性,因此缓存行填充会拉入2D和3D内存块而不是行。
最后,纹理管线可以执行“奖励”计算:处理边界条件(“纹理寻址”)和将8位和16位值转换为单位化浮点数是可以“免费”完成的操作。 (它们是纹理读取具有高延迟的原因之一)
纹理内存被优化用于2D空间局部性(它的名称也由此而来)。您可以将常量内存视为利用时间局部性的方式。
与常量内存相比,纹理内存的优势可以概括如下:
有关更多详细信息,请参见文档。
根据我的经验,访问纹理内存的速度与访问常量内存的速度一样快。但是纹理内存比常量内存大得多,因此如果您需要存储大块数据,我建议使用纹理内存而不是多次将其复制到常量内存中。此外,如果您需要进行插值,纹理内存是最佳选择。
另一方面,常量内存针对所有线程都从同一位置读取的情况进行了硬件优化。如果线程从多个位置读取,则访问会被串行化。