在编译时在cuda内核中使用__ldg时出错

时间:2014-06-05 20:19:28

标签: c++ cuda

我的目标是利用我的应用程序中的缓存内存并搜索在线示例,表明使用__ldg应该相对简单。

NVIDIA包含GPU优化的文档(可在此处找到:https://www.olcf.ornl.gov/wp-content/uploads/2013/02/GPU_Opt_Fund-CW1.pdf),它提供了直截了当的示例:

__global__ void kernel ( int *output, int *input)
{
  ...
  output[idx] = __ldg( &input[idx] );
}

但是当我尝试编译时,我收到以下错误消息:

error: identifier "__ldg" is undefined.  

不幸的是,在Google上搜索此错误消息的解决方案无济于事。有什么建议这个简单的例子可能有什么问题吗? 是否有我遗漏的编译器标志?

作为参考,我的设备是计算能力3.5,我正在使用CUDA 5.5

谢谢。

2 个答案:

答案 0 :(得分:8)

__ldg() intrinsic仅适用于计算能力3.5(或更新)架构。

这意味着:

  1. 必须在计算机3.5(或更新版本)GPU上运行
  2. 必须针对计算机3.5(或更新版本)GPU
  3. 进行编译
  4. 它也不能为旧架构编译。
  5. 这意味着:

    1. 这不会起作用:nvcc -arch=sm_30 ...
    2. 这将有效:nvcc -arch=sm_35 ...
    3. 这不会起作用:nvcc -gencode arch=compute30,code=sm_30 -gencode arch=compute_35,code=sm_35 ...

答案 1 :(得分:6)

对于__ldg的实现,它推广到任意类型并正确地回退到小于3.5的计算能力,请参阅BryanCatanzaro/generics Github项目。

这是一个简单的骨骼模板:

template<typename T>
__device__ __forceinline__ T ldg(const T* ptr) {
#if __CUDA_ARCH__ >= 350
    return __ldg(ptr);
#else
    return *ptr;
#endif
}