Caching 使部分(但不是全部)内存访问不缓存

Caching 使部分(但不是全部)内存访问不缓存,caching,cuda,gpgpu,Caching,Cuda,Gpgpu,我只是注意到(CUDA内核)内存访问完全可以不缓存(参见示例) 这能做到吗 对于单个内核 在运行时而不是在编译时 仅用于写入,而不是用于读取和写入 仅当您单独编译内核时,因为这是由代码生成启用的指令级功能。您还可以使用内联PTX汇编程序为内核中的特定加载操作发出ld.global.cg指令[有关详细信息,请参阅] 不,它是PTX的指令级功能。您可以在运行时JIT包含非缓存内存加载的代码版本,但从技术上讲,这仍然是编译。您可能会使用一些模板技巧和单独的编译来让运行时保存使用或不使用缓存构建的同

我只是注意到(CUDA内核)内存访问完全可以不缓存(参见示例)

这能做到吗

  • 对于单个内核
  • 在运行时而不是在编译时
  • 仅用于写入,而不是用于读取和写入
  • 仅当您单独编译内核时,因为这是由代码生成启用的指令级功能。您还可以使用内联PTX汇编程序为内核中的特定加载操作发出
    ld.global.cg
    指令[有关详细信息,请参阅]
  • 不,它是PTX的指令级功能。您可以在运行时JIT包含非缓存内存加载的代码版本,但从技术上讲,这仍然是编译。您可能会使用一些模板技巧和单独的编译来让运行时保存使用或不使用缓存构建的同一代码的两个版本,并在运行时在这些版本之间进行选择。您还可以使用相同的技巧获得给定内核的两个版本,其中不包含或不包含用于未缓存加载的内联PTX[请参阅以获取实现此目的的一种可能性]
  • 这些非缓存指令绕过具有字节级粒度的一级缓存到二级缓存。因此,它们是仅加载的(所有写入操作都会使一级缓存失效并存储到二级缓存)

  • 我不知道以前是否可能,但CUDA 8.0为您提供了一种微调特定读/写缓存的可能性。有关详细信息,请参阅

    例如,要使此代码在读取时始终转到主内存,请执行以下操作:

    const float4 val = input[i];
    
    您可以编写以下内容:

    float4 val;
    const float4* myinput = input+i;
    asm("ld.global.cv.v4.f32 {%0, %1, %2, %3}, [%4];" : "=f"(val.x), "=f"(val.y), "=f"(val.z), "=f"(val.w) : "l"(myinput));
    

    我设法将一个缓存密集型内核的速度提高了约20%,使用了非缓存的读写操作来处理设计只访问过一次的数据

    Wait,你是说uncached意味着只有un-L1-cached?也就是说,您只能绕过一级缓存?您可以自己读取我链接到的PDF,但二级缓存不能绕过。无法绕过二级缓存。还请注意,默认情况下,开普勒将从SM中提供共享内存的物理资源中删除。与开普勒一样,默认情况下也可以禁用Maxwell L1全局负载缓存(读取链接)。开普勒GK110B=特斯拉K40/K80@einpoklum:我脑海中闪现了一些其他的可能性(模板技巧和内联PTX,以获得两个版本的内核,有缓存加载和没有缓存加载)。我已经通过几个链接扩展了答案。非常感谢您的帮助和指导,包括这个问题和其他问题。