使一些(但不是全部)(CUDA)内存访问未缓存

时间:2015-05-24 06:36:23

标签: caching cuda gpgpu

我只是注意到它(CUDA内核)内存访问未被禁用(参见例如this answer here on SO)。

可以这样做......

  • 单独一个内核?
  • 在运行时而不是在编译时?
  • 仅用于写入而不是用于读写?

2 个答案:

答案 0 :(得分:3)

  1. 仅当您单独编译该内核时,因为这是一个由代码生成启用的指令级功能。您还可以使用内联PTX汇编程序为内核中的特定加载操作发出ld.global.cg指令[有关详细信息,请参阅here]。
  2. 不,这是PTX的指令级功能。您可以在运行时JIT包含非缓存内存加载的代码版本,但这仍然是技术上的编译。您可以使用一些模板技巧和单独的编译来使运行时保持使用或不使用缓存构建的相同代码的两个版本,并在运行时选择这些版本。您也可以使用相同的技巧来获取给定内核的两个版本,无需或不使用内联PTX来处理未缓存的负载[请参阅here了解实现此目的的一种可能性]
  3. 这些非缓存指令以字节级粒度绕过L1缓存到L2缓存。所以它们只是加载(所有写入使L1缓存无效并存储到L2)。

答案 1 :(得分:0)

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

例如,要使此代码始终在read:

上转到主内存
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%,这些读取和写入只能通过设计访问一次

相关问题