C++ 编译时在cuda内核中使用_ldg时出错

C++ 编译时在cuda内核中使用_ldg时出错,c++,cuda,C++,Cuda,我的目标是在我的应用程序中利用缓存,搜索在线示例表明使用\uu ldg应该相对简单 NVIDIA提供了有关GPU优化的文档(可在此处找到:),其中提供了一个简单的示例: __global__ void kernel ( int *output, int *input) { ... output[idx] = __ldg( &input[idx] ); } 但是,当我尝试编译此文件时,会收到以下错误消息: error: identifier "__ldg" is undefine

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

NVIDIA
提供了有关
GPU
优化的文档(可在此处找到:),其中提供了一个简单的示例:

__global__ void kernel ( int *output, int *input)
{
  ...
  output[idx] = __ldg( &input[idx] );
}
但是,当我尝试编译此文件时,会收到以下错误消息:

error: identifier "__ldg" is undefined.  
不幸的是,在谷歌上搜索这个错误消息的解决方案毫无帮助。有什么建议这个简单的例子可能有什么问题吗?
是否缺少编译器标志

作为参考,我的设备是compute capability 3.5,我使用的是
CUDA 5.5

多谢各位

仅在compute capability 3.5(或更新版本)体系结构上提供
\uu ldg()

这意味着:

  • 它必须在compute 3.5(或更新版本)GPU上运行
  • 它必须为compute 3.5(或更新版本)GPU编译
  • 它也不能针对较旧的体系结构进行编译
  • 这意味着:

  • 这不起作用:
    nvcc-arch=sm\u 30…
  • 这将起作用:
    nvcc-arch=sm_35…
  • 这不起作用:
    nvcc-gencode-arch=compute30,code=sm\u 30-gencode-arch=compute\u 35,code=sm\u 35…

  • 有关可推广到任意类型并正确依赖小于3.5的计算能力的
    \uu ldg
    实现,请参阅Github项目

    以下是一个基本模板:

    template<typename T>
    __device__ __forceinline__ T ldg(const T* ptr) {
    #if __CUDA_ARCH__ >= 350
        return __ldg(ptr);
    #else
        return *ptr;
    #endif
    }
    
    模板
    __设备强制内联ldg(常数T*ptr){
    #如果uuu CUDA uuuu ARCH uuuuuu>=350
    返回(ptr);
    #否则
    返回*ptr;
    #恩迪夫
    }
    
    编译命令行是什么?要利用cc3.5设备,您需要使用
    -arch=sm_35
    或类似工具为该体系结构进行编译。我相当确定这就是问题所在。我使用的是来自nVidia的示例代码,它们的makefile调用了多个标志,我认为它只会使用最高的可用功能,但是删除较低的计算功能标志会导致正确的编译。谢谢。@user3280204如果编译正确的体系结构解决了问题,我相信您应该接受下面给出的答案。