为什么CUDA不允许我们将所有SM内存用作L1缓存?

4
在CUDA设备中,每个SM都有64KB的芯片内存,靠近它放置。默认情况下,这被划分为48KB的共享内存和16KB的L1缓存。对于那些难以确定内存访问模式的内核,可以将此划分更改为16KB的共享内存和48KB的L1缓存。
为什么CUDA不允许所有64KB的每个SM芯片上的内存用作L1缓存?
有许多种内核没有使用共享内存的必要,但可以使用额外的16KB L1缓存。

纯属猜测,但也许实现方式是有两个独立的RAM块,一个48KiB,一个16KiB。配置只是切换哪个逻辑连接到哪个块。 - Roger Dahl
1
即使您不使用共享内存,仍会使用其中一部分来存储作为参数传递的数据。如果您使用“--ptxas-options=-v”,则可以将其视为“smem”。 - captain
5
@Jay这只适用于费米前架构。 - Pavan Yalamanchili
1
@Pavan 是正确的,在 Fermi 及以后的架构中,参数是通过常量内存传递的。 - harrism
1个回答

4
我认为这是由于计算机图形学的原因。当运行OpenGL或Direct3D代码时,SM使用直接映射内存(CUDA共享)用于一个目的(例如顶点属性),而使用集合关联内存(L1缓存)用于另一个目的。对于图形管线,架构师可以根据其他单元的顶点吞吐量限制来专门调整需要用于诸如顶点属性之类的东西的内存量。
在考虑GPU(以及一般的处理器设计)的架构决策时,重要的是要记住许多决策在很大程度上是经济因素。 GPU计算有一份工作:游戏和图形。如果没有这份工作,GPU计算就不可能变得经济可行,大规模并行计算也不太可能面向大众。
几乎每个GPU用于计算的功能在某种程度上都在图形管线中使用。如果它没有被使用(想想ECC内存),那么它必须通过更高的产品价格来为使用它的市场(想想HPC)提供资金支持。

1
特斯拉系列也有日常工作吗?我不知道在特斯拉上是否可以利用整个64k的L1缓存,但是特斯拉并不是作为游戏或图形卡销售的,所以为特斯拉添加那个开关岂不是很好? - Pavan Yalamanchili
特斯拉的日常工作就是GeForce和Quadro。在特斯拉和高端GeForce和Quadro之间,GPU实际上是相同的。 - harrism

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