常量内存是一种专用内存,用于只读数据和统一访问线程束中线程的数据。常量内存对于内核代码是只读的,但对主机而言是可读写的。
常量内存位于设备的DRAM上,并且有一个专用的片上缓存。从每个SM的常量缓存中读取的延迟,比直接从常量内存中读取的低得多。
常量内存有一个不同于其他内存的最优访问模式。在常量内存中,如果线程束中的所有线程都访问相同的位置,那么这个访问模式就是最优的。如果线程束中的线程访问不同的地址,则访问就需要串行。因此,一个常量内存读取的成本与线程束中线程读取唯一地址的数量呈线性关系。
在全局作用域中用以下修饰符声明常量变量
__constant__
常量内存变量的生存周期与整个应用程序相同,对网格内的所有线程都是可访问的。
例如,公式计算中的系数经常作为常量内存保存。
与只读缓存的比较
开普勒GPU使用GPU纹理流水线作为只读缓存。
一般来说,只读缓存在分散读取方面比一级缓存更好,当线程束中的线程都读取相同地址时,不应使用只读缓存。
只读缓存是独立的,而且区别于常量缓存。通过常量缓存加载的数据必须是相对较小的,而且访问必须一致以获得好的性能(一个线程束内的所有线程在任何给定时间内都访问相同的位置)。而通过只读缓存加载的数据可以是比较大的,而且能够在一个非统一的模式下进行访问。
线程束洗牌指令
从开普勒系列的GPU开始,洗牌指令被加入其中。只要两个线程在相同的线程束中,那么就允许这两个线程直接读取另一个线程的寄存器。
洗牌指令让线程束中的线程可以彼此之间直接交换数据,而不是通过共享内存或全局内存来进行。因为线程束洗牌指令在线程