根据"CUDA C Programming Guide",只有在多处理器常量缓存被命中时(第5.3.2.4节) 1 ,常量内存访问才有好处。否则,对于半翘曲,可能存在比合并的全局存储器读取更多的存储器请求。那么为什么常量内存大小限制为64 KB?
为了不再问两次,还有一个问题。据我所知,在Fermi架构中,纹理缓存与L2缓存相结合。纹理使用是否仍然有意义,或者全局内存读取是否以相同的方式缓存?
1 恒定记忆(第5.3.2.4节)
常量内存空间驻留在设备内存中,并缓存在F.3.1和F.4.1节中提到的常量缓存中。
对于计算能力1.x的设备,warp的常量内存请求首先被分成两个请求,每个半warp一个,这些请求是独立发布的。
然后将请求拆分为多个单独的请求,因为初始请求中存在不同的内存地址,从而将吞吐量降低了等于单独请求数量的因素。
然后,在高速缓存命中的情况下,或者在设备内存的吞吐量下,以恒定高速缓存的吞吐量为结果请求提供服务。
答案 0 :(得分:17)
计算能力1.0-3.0设备的常量内存大小为64 KB。缓存工作集只有8KB(参见CUDA编程指南v4.2表F-2)。
常量内存由驱动程序,编译器和声明为__device__ __constant__
的变量使用。驱动程序使用常量内存来传递参数,纹理绑定等。编译器在许多指令中使用常量(请参阅反汇编)。
可以使用主机运行时函数cudaMemcpyToSymbol()
和cudaMemcpyFromSymbol()
读取和写入置于常量内存中的变量(参见CUDA编程指南v4.2第B.2.2节)。常量内存位于设备内存中,但可通过常量缓存进行访问。
在Fermi纹理上,常量,L1和I-Cache都是每个SM中或周围的1级缓存。所有级别1都通过L2缓存缓存访问设备内存。
64 KB常量限制是每个CUmodule,它是一个CUDA编译单元。 CUmodule的概念隐藏在CUDA运行时下,但可由CUDA驱动程序API访问。