8

当我们使用 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]:编译器生成的常量(其中一些可能对应源代码中的文字常量)

4

2 回答 2

6

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

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

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

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

于 2012-09-06T04:31:26.833 回答
0

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

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

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

于 2013-03-28T17:27:20.933 回答