当我们使用xptxas检查寄存器使用情况时,我们会看到如下内容:
ptxas info : Used 63 registers, 244 bytes cmem[0], 51220 bytes cmem[2], 24 bytes cmem[14], 20 bytes cmem[16]
我想知道目前是否有任何文件清楚地解释了cmem [x]。将常数存储器分成多个存储体,总共存在多少个存储体,以及除了0,2,14,16之外的其他存储体有什么用呢?
作为旁注,@ njuffa(特别感谢你)之前在nvidia的论坛上解释过什么是0,2,14,16:
使用的常量内存在常量程序'变量'(库1)中分区,加上编译器生成的常量(库14)。
cmem [0]:内核参数
cmem [2]:用户定义的常量对象
cmem [16]:编译器生成的常量(其中一些可能对应于源代码中的文字常量)
答案 0 :(得分:5)
据我所知,CUDA对GPU常数库的使用并未正式记录。恒定库的数量和用法在GPU代之间确实不同。这些是程序员不必担心的低级实现细节。
如果需要,可以通过查看为给定平台生成的机器代码(SASS)来反转设计常量库的使用。事实上,这就是我提出原始问题中引用的信息的方式(这些信息来自我的NVIDIA开发者论坛帖子)。我记得,我在那里提供的信息是基于专门应用于费米级设备的特殊逆向工程,但我目前无法验证这一点,因为论坛目前无法访问。
拥有多个常量库的一个原因是为CUDA程序员保留用户可见的常量内存,同时在其他常量库中存储由硬件或工具提供的其他只读信息。
请注意,CUDA数学库作为源文件提供,函数内联到用户代码中,因此CUDA数学库函数的常量内存使用情况包含在用户可见常量内存的统计信息中。
答案 1 :(得分:0)
请参阅“Miscellaneous NVCC Usage”。 他们提到,恒定的银行分配是特定于配置文件的。
在PTX guide中,他们说除了64KB常量内存外,他们还有10个内存用于恒定内存。驱动程序可以在这些区域中分配和初始化常量缓冲区,并将指针作为内核函数参数传递给缓冲区。
我想,为nvcc提供的配置文件将处理哪些常量进入哪个内存。无论如何,我们不需要担心每个常量内存cmem [n]是否小于64KB,因为每个bank的大小为64KB,并且对于网格中的所有线程都是通用的。