【问题标题】:CUDA constant memory banksCUDA 常量内存库
【发布时间】: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:我记得我为一个示例程序逆向工程了临时银行分配,我不再拥有这些信息,也无法访问我的旧论坛帖子。我认为它被准确引用但无法确定。

标签: cuda gpu-constant-memory


【解决方案1】:

据我所知,CUDA 对 GPU 常量库的使用没有正式记录。常量库的数量和使用在 GPU 代之间确实有所不同。这些是程序员不必担心的低级实现细节。

如果需要,可以通过查看为给定平台生成的机器代码 (SASS) 对常量库的使用进行逆向工程。事实上,这就是我想出原始问题中引用的信息的方式(此信息来自我的 NVIDIA 开发者论坛帖子)。我记得,我在那里提供的信息是基于专门应用于费米级设备的临时逆向工程,但我目前无法验证这一点,因为目前无法访问论坛。

拥有多个常量库的一个原因是保留用户可见的常量内存以供 CUDA 程序员使用,同时将硬件或工具提供的其他只读信息存储在其他常量库中。

请注意,CUDA 数学库是作为源文件提供的,并且函数被内联到用户代码中,因此 CUDA 数学库函数的常量内存使用情况包含在用户可见常量内存的统计信息中。

【讨论】:

    【解决方案2】:

    请参阅“Miscellaneous NVCC Usage”。 他们提到,恒定的银行分配是特定于配置文件的。

    PTX guide 中,他们说除了 64KB 常量内存之外,他们还有 10 个用于常量内存的银行。驱动程序可以在这些区域分配和初始化常量缓冲区,并将指向缓冲区的指针作为内核函数参数传递。

    我想,为 nvcc 提供的配置文件将处理哪些常量进入哪个内存。无论如何,如果每个常量内存 cmem[n] 小于 64KB,我们不必担心,因为每个 bank 的大小为 64KB,并且对网格中的所有线程都是通用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多