7.3 常量内存

常量内存使用__constant标识进行描述,常量内存作为全局地址空间的一部分,在运行时可以分配出出相应的缓存空间,利用常量内存可以提高应用访存效率。使用常量地址空间的方式有两种:

  1. 可以通过数组创建的方式,之后将数组作为参数传入内核中。内核参数描述上,必须指定__constant为对应指针的标识符。
  2. 内核端声明常量对象,并使用__constant标识对其进行初始化,其属于编译时常量类型。

不同架构下,常量内存对应的位置也不同。AMD GPU上常量数据将会保存在缓存上(保存通用数据)。该缓存比L1缓存的延迟还要低,并且能大大减少GPU内的数据传输。根据这种访存模式,其地址可能就直接保存在指令中,就算是释放功能单元也只有极低的寻址延迟。

OpenCL对每个设备会有常量参数个数的限制,以及常量数组的最大尺寸。编程者可以将CL_DEVICE_MAX_CONSTANT_ARGS和CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE传入clGetDeviceInfo()进行查询。第8章中,我们介绍在现代GPU上如何实现常量内存。