CUDA常量内存库

CUDA常量内存库,cuda,gpu-constant-memory,Cuda,Gpu Constant Memory,当我们使用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(特别感谢您)之前在nvid

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

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

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

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

请注意,CUDA数学库是作为源文件提供的,函数内联到用户代码中,因此CUDA数学库函数的恒定内存使用量包含在用户可见恒定内存的统计数据中。

请参阅“”。 他们提到,固定的银行分配是特定于个人资料的

在实验中,他们说除了64KB的固定内存外,他们还有10个固定内存库。驱动程序可以在这些区域中分配和初始化常量缓冲区,并将指针作为内核函数参数传递给缓冲区


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

不客气。我想我在英伟达论坛中提到过,在GPU架构中,固定银行的数量不同,银行分配也是如此。换句话说,这些是程序员不应该担心的实现细节,因为它们不是编程模型的一部分。使用多个存储库的一个原因是为了最大限度地减少冲突使用常量内存的可能性,特别是让程序员尽可能多的常量存储库可用于用户代码。@njuffa我认为这(以及上面论坛帖子中的引用)应该转化为一个答案。:)@我有一个后续问题。《编程指南》说,执行配置的参数是在实际函数参数和函数参数通过共享内存传递到设备之前进行计算的。我的理解是,在编译时,参数会复制到cmem[0],但在运行时,它们会在新块开始之前从cmem复制到smem。这是正确的吗?我几乎可以肯定引用的信息仅适用于sm_1x设备。我正在寻求更了解这一点的人的澄清。我记得,对于sm_1x设备,共享内存开始处的16字节块存储启动配置,然后是内核函数参数。对于以后的芯片,共享内存根本就不起作用(将其全部留给程序员):启动配置在特殊寄存器中传递,而内核函数参数存储在常量库中。程序员不必担心实现细节。我确认通过共享内存传递启动配置只适用于sm_1x。除此之外,我被告知sm_2x和sm_3x处理启动参数传递的方式不同。这突出了一个事实,即试图跟上不断变化的实施细节是徒劳的(与使用注册银行相同)@哈里斯:我记得我为一个样本项目临时反向设计了固定银行分配,现在我已经没有这些信息了,也无法访问我以前的论坛帖子。我想它被准确地引用了,但没有办法确定。