解决推力/CUDA 警告“无法分辨指针指向的...”
Posted
技术标签:
【中文标题】解决推力/CUDA 警告“无法分辨指针指向的...”【英文标题】:Resolving Thrust/CUDA warnings "Cannot tell what pointer points to..." 【发布时间】:2011-07-09 22:21:10 【问题描述】:我正在尝试使用 Thrust/CUDA 4.0 构建一个简单的应用程序并收到很多警告“警告:无法判断指针指向的内容,假设是全局内存空间”
有其他人看到过这个吗?我该如何禁用它们或修复我的代码?
谢谢,
阿德
这是我的代码。
你好.h
class DECLSPECIFIER Hello
private:
thrust::device_vector<unsigned long> m_device_data;
public:
Hello(const thrust::host_vector<unsigned long>& data);
unsigned long Sum();
unsigned long Max();
;
你好.cu
#include "Hello.h"
Hello::Hello(const thrust::host_vector<unsigned long>& data)
m_device_data = data;
unsigned long Hello::Sum()
return thrust::reduce(m_device_data.cbegin(), m_device_data.cend(), 0, thrust::plus<unsigned long>());
unsigned long Hello::Max()
return *thrust::max_element(m_device_data.cbegin(), m_device_data.cend(), thrust::less<unsigned long>());
输出
1> Compiling CUDA source file Hello.cu...
1>
1> C:\SrcHg\blog\HelloWorld\HelloWorldCuda>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" --use-local-env --cl-version 2008 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include" -G0 --keep-dir "Debug" -maxrregcount=32 --machine 32 --compile -D_NEXUS_DEBUG -g -Xcompiler "/EHsc /nologo /Od /Zi /MDd " -o "Debug\Hello.cu.obj" "C:\SrcHg\blog\HelloWorld\HelloWorldCuda\Hello.cu"
1> Hello.cu
1> tmpxft_00001fac_00000000-0_Hello.cudafe1.gpu
1> tmpxft_00001fac_00000000-5_Hello.cudafe2.gpu
1> Hello.cu
1>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include\thrust/detail/internal_functional.h(197): warning : Cannot tell what pointer points to, assuming global memory space
1>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include\thrust/detail/internal_functional.h(197): warning : Cannot tell what pointer points to, assuming global memory space
1>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include\thrust/detail/internal_functional.h(197): warning : Cannot tell what pointer points to, assuming global memory space
有很多这样的。
【问题讨论】:
【参考方案1】:所以...想通了,我想我会把它贴在这里。解决方案是
不要在 NVCC 上使用 -G 标志
或
如果您的目标是这样的设备,请为 arch sm_20 (Fermi) 编译
这是 NVCC 的一个已知限制,而不是 Thrust 错误。见:
http://groups.google.com/group/thrust-users/browse_thread/thread/1914198abf646c6d/8bc00e6030b0030b?#8bc00e6030b0030b
【讨论】:
【参考方案2】:Fermi 使用共享和全局内存空间的统一寻址,而 pre-Fermi 消息没有。
对于 pre-Fermi 案例,当您获得一个地址时,您不知道它应该是共享的还是全局的。编译器试图弄清楚它,但有时它不能。当这种情况发生时,会弹出消息——“假设全局”在 99.999% 的情况下是正确的,因为当你想要一个指向共享内存的指针时,你通常显式地获取一个共享变量的地址,编译器可以识别出来。
对于 Fermi 卡,可以在运行时(基于地址)推断共享或全局,编译器无需做出任何假设。
建议:忽略这些警告。
【讨论】:
【参考方案3】:如果您使用的是 mirosoft Visual Studio:从项目->属性->CUDA C/C++->设备->代码生成;将 compute_10,sm_10 更改为 compute_20,sm_20
【讨论】:
以上是关于解决推力/CUDA 警告“无法分辨指针指向的...”的主要内容,如果未能解决你的问题,请参考以下文章
将 cv::cuda::GpuMat 与推力和测试推力 API 一起使用时出现问题
cuda 推力::for_each 与推力::counting_iterator