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()
这意味着:
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如果编译正确的体系结构解决了问题,我相信您应该接受下面给出的答案。