CUDA_常量内存

CUDA中的常量内存是一种全局内存的虚拟形式,具备高速缓存和广播特性,最大64K。常量内存可通过__constant__关键字声明,可以在运行时通过cudaCopyToSymbol修改。主机与设备间可以通过预定义宏__CUDA_ARCH__复制常量内存。CUDA运行时API使用cudaMemecpyToSymbol等函数访问,驱动程序API则需借助cuModuleGlobal等函数。常量内存的定义和初始化需注意作用范围和初始化方式。
摘要由CSDN通过智能技术生成

常量内存简介

常量内存其实只是全局内存的一种虚拟地址形式,并没有特殊保留的常量内存块。常量内存有两个特性:

  • 高速缓存,拥有缓存加速;
  • 支持将单个值广播到线程束中的每个线程

常量内存的大小限定为64K,每个SM拥有8KB的常数存储器缓存,在编译期时声明一块常量内存,需要用到__constant__关键字,例如

__constant__ float my_array[1024] = { 0.0F, 1.0F, 1.3F, ...};

不同于c/c++中的const常量,cuda中常量内存在声明后是可以修改的。如果要在运行时改变常量内存中内容,只需要在调用GPU内核之前简单地调用cudaCopyToSymbol函数。如果在编译阶段或主机端运行阶段都没有定义常量内存,那么常量内存区将未定义。

主机与设备常量内存

使用预定义宏__CUDA_ARCH__来支持主机与设备的常量内存复制,这会方便CPU和GPU对内存的读取。

__constant__ double dc_vals[2] = {0.0, 1000.0};
       const double hc_vals[2] = {0.0, 1000.0};
      
__device__ __host__ double f(size_t i)
{
#ifdef __CUDA_ARCH__
	return dc_vals[i];
#else
	return hc_vals[i];
#endif
}

访问常量内存

cuda运行时api

cuda运行时应用程序可以使用函数cudaMemecpyToSymbol()和cudaMemcpyFromSymbol()分别复制数据到常量内存和从常量内存复制数据。常量内存的指针可以使用cudaGetSymbolAddress()函数查询。

驱动程序api

驱动程序api应用程序可以使用函数cuModuleGlobal()查询常量内存的设备指针。由于驱动程序api不包括cuda运行时的语言集成特性。驱动程序api不包括像cudaMemcpyToSymbol()这样的特殊内存复制函数。所以必须使用cuModuleGetGlobal()查询地址,之后使用cuMemcpyHtoD()或cuMemcpyDtoH().

常量存储器使用案例

__constant__ char p_HelloCUDA[11];
__constant__ int t_HelloCUDA[11] = {
   0,1,2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值