有什么区别,在CUDA程序中定义设备常量的最佳方法是什么?在C ++,主机/设备程序中,如果我想将常量定义为设备常量内存,我可以做任何一个
__device__ __constant__ float a = 5;
__constant__ float a = 5;
问题1.在设备2.x和CUDA 4上,它是否与
相同__device__ const float a = 5;
问题2.为什么在PyCUDA SourceModule(“”“......”“”)中,它只编译设备代码,甚至以下工作?
const float a = 5;
答案 0 :(得分:7)
在CUDA中__constant__
是一个变量类型限定符,表示声明的变量将存储在设备常量内存中。引用CUDA编程指南的B 2.2节
__constant__
限定符,可选择与__device__
一起使用, 声明一个变量:
- 驻留在恒定的内存空间中,
- 具有应用程序的生命周期,
- 可以从所有线程访问 在网格内,从主机到运行时库 (
cudaGetSymbolAddress()
/cudaGetSymbolSize()
/cudaMemcpyToSymbol()
/cudaMemcpyFromSymbol()
表示运行时API,cuModuleGetGlobal()
表示 驱动程序API)。
在CUDA中,常量内存是通过高速缓存访问的专用静态全局内存区域(为此目的有一组专用的PTX加载指令),它们对于正在运行的内核中的所有线程是统一且只读的。但是,通过使用上面引用的主机端API,可以在运行时修改常量内存的内容。这与使用const
声明向编译器声明变量不同,后者在声明范围内向变量添加只读特性。两者完全没有相同之处。