常规 C/C++ 样式常量:在 CUDA C(本身是 C99 的修改)中,常量是绝对编译时实体。考虑到 GPU 处理的性质,NVCC 中发生的优化量非常重要,这不足为奇。
#define
: 宏总是很不优雅,但在紧要关头很有用。
然而,__constant__
变量说明符是一种全新的动物,在我看来有点用词不当。我将在下面的空白处记下 Nvidia的内容:
限定词,可选地与__constant__
一起使用
__device__
,声明一个变量:
- 驻留在恒定的内存空间中,
- 具有应用程序的生命周期,
- 可从网格内的所有线程和主机通过运行时库 (cudaGetSymbolAddress() / cudaGetSymbolSize() / cudaMemcpyToSymbol() / cudaMemcpyFromSymbol()) 访问。
Nvidia 的文档指定它__constant__
以寄存器级别的速度(接近零延迟)可用,前提是它是一个扭曲的所有线程访问的相同常量。
它们在 CUDA 代码中的全局范围内声明。但是,根据个人(和当前正在进行的)经验,当涉及到单独编译时,您必须小心使用此说明符,例如通过在 C 中放置包装函数将 CUDA 代码(.cu 和 .cuh 文件)与 C/C++ 代码分开样式的标题。
然而,与传统的“常量”指定变量不同,这些变量是在运行时从分配设备内存并最终启动内核的主机代码初始化的。我再说一遍,我目前正在工作的代码演示这些可以在内核执行之前使用 cudaMemcpyToSymbol() 在运行时设置。
考虑到保证访问的 L1 缓存级速度,至少可以说它们非常方便。