我的目标是利用我的应用程序中的缓存内存并搜索在线示例,表明使用__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
。
谢谢。
答案 0 :(得分:8)
__ldg()
intrinsic仅适用于计算能力3.5(或更新)架构。
这意味着:
这意味着:
nvcc -arch=sm_30 ...
nvcc -arch=sm_35 ...
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
}