CUDA仅为一个变量禁用L1缓存

时间:2012-09-23 14:20:35

标签: caching assembly cuda cpu-cache ptx

CUDA 2.0设备上是否有办法仅针对一个特定变量禁用L1缓存? 我知道可以在编译时禁用L1缓存,为所有内存操作添加标志-Xptxas -dlcm=cgnvcc。 但是,我想仅对特定全局变量的内存读取禁用缓存,以便所有其余内存读取都通过L1缓存。

根据我在网络上进行的搜索,可能的解决方案是通过PTX汇编代码。

3 个答案:

答案 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变量执行,因为编译器假定它们可能由另一个线程编写。