首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译时在cuda内核中使用__ldg时出错

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

Stack Overflow用户
提问于 2014-06-05 20:19:27
回答 2查看 5.3K关注 0票数 3

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

NVIDIA提供了用于GPU优化的文档(见此处:Fund-CW1.pdf),其中提供了一个简单的示例:

代码语言:javascript
复制
__global__ void kernel ( int *output, int *input)
{
  ...
  output[idx] = __ldg( &input[idx] );
}

然而,当我试图编译它时,我会得到以下错误消息:

代码语言:javascript
复制
error: identifier "__ldg" is undefined.  

搜索Google来寻找这个错误信息的解决方案是很不幸的。有什么建议吗?这个简单的例子可能有什么问题?

是否有我缺少的编译器标志?

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-06 03:35:47

__ldg() 内禀仅在计算能力3.5 (或更新)体系结构上可用。

这意味着:

  1. 它必须在计算3.5 (或更新) GPU上运行
  2. 必须为计算3.5 (或更新) GPU编译
  3. 它也不能为较旧的体系结构编译。

这意味着:

  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 ...
票数 10
EN

Stack Overflow用户

发布于 2014-12-04 19:08:04

有关泛化为任意类型并正确返回到小于3.5的计算能力的__ldg的实现,请参见BryanCatanzaro/泛型 Github项目。

下面是一个裸露的骨头模板:

代码语言:javascript
复制
template<typename T>
__device__ __forceinline__ T ldg(const T* ptr) {
#if __CUDA_ARCH__ >= 350
    return __ldg(ptr);
#else
    return *ptr;
#endif
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24069524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档