【发布时间】:2012-09-05 22:30:55
【问题描述】:
当我们使用 xptxas 检查寄存器使用情况时,我们会看到如下内容:
ptxas info : Used 63 registers, 244 bytes cmem[0], 51220 bytes cmem[2], 24 bytes cmem[14], 20 bytes cmem[16]
我想知道目前是否有任何文档清楚地解释了 cmem[x]。将常量内存分成多个bank有什么意义,总共有多少个bank,除了0、2、14、16之外的其他bank有什么用?
作为旁注,@njuffa(特别感谢您)之前在 nvidia 的论坛上解释了什么是银行 0、2、14、16:
使用的常量内存被划分为常量程序“变量”(bank 1),以及编译器生成的常量(bank 14)。
cmem[0]:内核参数
cmem[2]:用户定义的常量对象
cmem[16]:编译器生成的常量(其中一些可能对应源码中的文字常量)
【问题讨论】:
-
不客气。我想我在 NVIDIA 论坛上的帖子中提到,GPU 架构之间的常量存储库数量不同,存储库分配也是如此。换句话说,这些是程序员不应该担心的实现细节,因为它们不是编程模型的一部分。使用多个 bank 的原因之一是尽量减少常量内存使用冲突的可能性,特别是尽可能多地为用户代码保留程序员可见的常量 bank。
-
@njuffa 我认为这(连同您上面论坛帖子中的引用)应该转换为答案。 :)
-
@njuffa 我有一个后续问题。编程指南说执行配置的参数在实际函数参数之前进行评估,并且像函数参数一样,当前通过共享内存传递给设备。我的理解是在编译时,参数被复制到 cmem[0],但在运行时,它们会在新块开始之前从 cmem 复制到 smem。对吗?
-
我几乎可以肯定引用的信息仅适用于 sm_1x 设备。我正在寻求对此更了解的人的澄清。我记得,对于 sm_1x 设备,共享内存开头的 16 字节块存储了启动配置,然后是内核函数参数。对于后来的芯片,共享内存根本不发挥作用(将其全部留给程序员):启动配置在特殊寄存器中传递,而内核函数参数存储在常量库中。实现细节程序员不必担心。
-
我确认通过共享内存传递启动配置仅适用于 sm_1x。除此之外,我被告知 sm_2x 和 sm_3x 以不同的方式处理启动参数的传递。这突出了一个事实,即试图跟上不断变化的实现细节是徒劳的(与寄存器组的使用相同)。 @harrism:我记得我为一个示例程序逆向工程了临时银行分配,我不再拥有这些信息,也无法访问我的旧论坛帖子。我认为它被准确引用但无法确定。