CUDA 2.0设备上是否有办法仅针对一个特定变量禁用L1缓存?
我知道可以在编译时禁用L1缓存,为所有内存操作添加标志-Xptxas -dlcm=cg
到nvcc
。
但是,我想仅对特定全局变量的内存读取禁用缓存,以便所有其余内存读取都通过L1缓存。
根据我在网络上进行的搜索,可能的解决方案是通过PTX汇编代码。
答案 0 :(得分:14)
如上所述,您可以使用内联PTX,这是一个示例:
__device__ __inline__ double ld_gbl_cg(const double *addr) {
double return_value;
asm("ld.global.cg.f64 %0, [%1];" : "=d"(return_value) : "l"(addr));
return return_value;
}
您可以通过将.f64替换为.f32(float)或.s32(int)等来轻松改变这种情况。对于“= f”(float)或“= r”(int),return_value“= d”的约束)etc。请注意,之前的最后一个约束(addr) - “l” - 表示64位寻址,如果使用32位寻址,则应为“r”。
答案 1 :(得分:5)
内联PTX可用于加载和存储变量。 ld.cg和st.cg指令仅缓存L2中的数据。高速缓存运算符在PTX ISA 2.3文档的8.7.8.1高速缓存运算符中描述。说明或兴趣是 ld 和 st 。内联PTX在Using Inline PTX Assembly in CUDA中描述。
答案 2 :(得分:0)
如果您将变量声明为volatile
,那么它将仅缓存在Fermi GPU上的L2缓存中。请注意,某些编译器优化(例如删除重复加载)不会对volatile变量执行,因为编译器假定它们可能由另一个线程编写。