cuda中的预取(通过C代码)

cuda中的预取(通过C代码),cuda,prefetch,Cuda,Prefetch,我正在通过C代码在CUDA(费米GPU)中进行数据预取。Cuda参考手册讨论的是ptx级代码而不是C级代码的预取 有人可以通过cuda代码(cu文件)向我提供一些关于预取的文档或信息吗。任何帮助都将不胜感激。以下是PTX中预取的工作原理: 您可以将PTX指令嵌入CUDA内核。以下是一个小样本: 您可以通过C中的以下预取功能得出结论: __device__ void prefetch_l1 (unsigned int addr) { asm(" prefetch.global.L1 [ %

我正在通过C代码在CUDA(费米GPU)中进行数据预取。Cuda参考手册讨论的是ptx级代码而不是C级代码的预取

有人可以通过cuda代码(cu文件)向我提供一些关于预取的文档或信息吗。任何帮助都将不胜感激。

以下是PTX中预取的工作原理:

您可以将PTX指令嵌入CUDA内核。以下是一个小样本:

您可以通过C中的以下预取功能得出结论:

__device__ void prefetch_l1 (unsigned int addr)
{

  asm(" prefetch.global.L1 [ %1 ];": "=r"(addr) : "r"(addr));
}
注意:预取需要计算能力为2.0或更高的GPU。根据,相应地传递正确的编译标志,下面是不同缓存预取技术的代码:

#define DEVICE_STATIC_INTRINSIC_QUALIFIERS  static __device__ __forceinline__

#if (defined(_MSC_VER) && defined(_WIN64)) || defined(__LP64__)
#define PXL_GLOBAL_PTR   "l"
#else
#define PXL_GLOBAL_PTR   "r"
#endif

DEVICE_STATIC_INTRINSIC_QUALIFIERS void __prefetch_global_l1(const void* const ptr)
{
  asm("prefetch.global.L1 [%0];" : : PXL_GLOBAL_PTR(ptr));
}

DEVICE_STATIC_INTRINSIC_QUALIFIERS void __prefetch_global_uniform(const void* const ptr)
{
  asm("prefetchu.L1 [%0];" : : PXL_GLOBAL_PTR(ptr));
}

DEVICE_STATIC_INTRINSIC_QUALIFIERS void __prefetch_global_l2(const void* const ptr)
{
  asm("prefetch.global.L2 [%0];" : : PXL_GLOBAL_PTR(ptr));
}

你能给我提供一些关于预取工作原理的更多文档吗,比如对概念本身的解释。当然!查看此GPGPU预取研究,并查阅参考资料,以了解更多有关概念的信息:良好提升。现在我们只需要一个例子来说明这些实际上提供了好处。@tera我有一个一般的经验法则:如果Nisght Compute将长记分牌暂停列为最主要的暂停贡献者,那么您将主要从预取中获益。这条经验法则在9/10的案例中对我有效。这对于占用率低的内核非常重要(例如,当您仅限于扭曲或块时)。
#define DEVICE_STATIC_INTRINSIC_QUALIFIERS  static __device__ __forceinline__

#if (defined(_MSC_VER) && defined(_WIN64)) || defined(__LP64__)
#define PXL_GLOBAL_PTR   "l"
#else
#define PXL_GLOBAL_PTR   "r"
#endif

DEVICE_STATIC_INTRINSIC_QUALIFIERS void __prefetch_global_l1(const void* const ptr)
{
  asm("prefetch.global.L1 [%0];" : : PXL_GLOBAL_PTR(ptr));
}

DEVICE_STATIC_INTRINSIC_QUALIFIERS void __prefetch_global_uniform(const void* const ptr)
{
  asm("prefetchu.L1 [%0];" : : PXL_GLOBAL_PTR(ptr));
}

DEVICE_STATIC_INTRINSIC_QUALIFIERS void __prefetch_global_l2(const void* const ptr)
{
  asm("prefetch.global.L2 [%0];" : : PXL_GLOBAL_PTR(ptr));
}