根据"CUDA C编程指南", 只有当多处理器常量缓存被命中时,常量内存访问才会受益(第5.3.2.4节)1。否则,半warp可能比聚合全局内存读取的情况下产生更多的内存请求。那么为什么常量内存大小限制为64 KB呢?
还有一个问题,为了不重复提问。据我所了解,在Fermi架构中,纹理缓存与L2缓存合并。纹理使用是否仍然有意义,或者全局内存读取以相同的方式进行缓存?
还有一个问题,为了不重复提问。据我所了解,在Fermi架构中,纹理缓存与L2缓存合并。纹理使用是否仍然有意义,或者全局内存读取以相同的方式进行缓存?
1常量内存(第5.3.2.4节)
常量内存空间驻留在设备内存中,并缓存在第F.3.1和F.4.1节中提到的常量缓存中。
对于计算能力为1.x的设备,warp的常量内存请求首先会被分成两个请求,一个用于每个半warp,这些请求是独立发出的。
然后将一个请求拆分为与初始请求中不同的内存地址一样多的单独请求,从而将吞吐量降低了一个因子,该因子等于单独请求的数量。
如果缓存命中,则以常量缓存的吞吐量服务于结果请求;否则以设备内存的吞吐量服务于结果请求。