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

时间:2012-11-07 08:42:55

标签: cuda prefetch

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

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

2 个答案:

答案 0 :(得分:5)

根据PTX manual,这里是预取在PTX中的工作方式:

enter image description here

您可以将PTX指令嵌入CUDA内核。以下是来自NVIDIA's documentation的小样本:

__device__ int cube (int x)
{
  int y;
  asm("{\n\t"                       // use braces for local scope
      " .reg .u32 t1;\n\t"           // temp reg t1,
      " mul.lo.u32 t1, %1, %1;\n\t" // t1 = x * x
      " mul.lo.u32 %0, t1, %1;\n\t" // y = t1 * x
      "}"
      : "=r"(y) : "r" (x));
  return y;
}

您可以在C:

中结束以下预取功能
__device__ void prefetch_l1 (unsigned int addr)
{

  asm(" prefetch.global.L1 [ %1 ];": "=r"(addr) : "r"(addr));
}

注意:您需要具有Compute Capability 2.0或更高版本的GPU才能进行预取。相应地传递适当的编译标志-arch=sm_20

答案 1 :(得分:0)

根据this thread,以下是用于不同的缓存预取技术的代码:

#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));
}