C++ 如何构建CUDA推力装置排序示例?
我正试图在VisualStudio2010中使用CUDA的最新版本(7.0)和附带的THURST安装来构建和运行推力示例代码。我无法生成和运行示例代码 通过删除部分代码,我发现问题在于推力::排序(..)调用。主机向量工作正常,但设备向量会产生以下编译错误: 1> c:\program files\nvidia gpu computing toolkit\cuda\v7.0\include\推力\system\cuda\detail\sort.inl(203):错误C2027:使用未定义的类型“推力::细节::静态断言\u失败” 这是我正在使用的不会编译的示例代码,它主要来自于 但保留使用宿主向量的行:C++ 如何构建CUDA推力装置排序示例?,c++,visual-studio-2010,sorting,cuda,thrust,C++,Visual Studio 2010,Sorting,Cuda,Thrust,我正试图在VisualStudio2010中使用CUDA的最新版本(7.0)和附带的THURST安装来构建和运行推力示例代码。我无法生成和运行示例代码 通过删除部分代码,我发现问题在于推力::排序(..)调用。主机向量工作正常,但设备向量会产生以下编译错误: 1> c:\program files\nvidia gpu computing toolkit\cuda\v7.0\include\推力\system\cuda\detail\sort.inl(203):错误C2027:使用未定义的类型“
thrust::sort(h_vec.begin(), d_vec.end());
它编译并运行得很好,尽管排序似乎是在主机上运行的
如何编译和运行示例代码,以便在设备向量而不是主机向量上进行排序
我的系统配置包括:
- 已安装Visual Studio 2010/SP1
- Windows 7 pro,64位
- CUDA 7.0开发工具包
- NVIDA Quadro K4000配备最新驱动程序
thrust::sort(h_vec.begin(), d_vec.end());
这里的第一个参数是要排序的范围的开始,第二个参数是范围的结束。第一个参数将范围的开始标识为主机上,将范围的结束标识为设备上。这将触发编译错误
将其更改为:
thrust::sort(h_vec.begin(), h_vec.end());
您的代码为我编译并成功运行
在上面的例子中,这一行是完全无用的。不需要对数据进行排序,您仍将在此处覆盖结果:
thrust::copy(d_vec.begin(), d_vec.end(), h_vec.begin());
(将CW标记为Jared Hoberock指出的关键问题)正如@JaredHoberock指出的,关键问题可能是您试图编译一个.cpp文件。您需要将该文件重命名为.cu,并确保它由nvcc编译 在您修复该问题之后,您可能会遇到另一个问题。这是不正确的,不会编译:
thrust::sort(h_vec.begin(), d_vec.end());
这里的第一个参数是要排序的范围的开始,第二个参数是范围的结束。第一个参数将范围的开始标识为主机上,将范围的结束标识为设备上。这将触发编译错误
将其更改为:
thrust::sort(h_vec.begin(), h_vec.end());
您的代码为我编译并成功运行
在上面的例子中,这一行是完全无用的。不需要对数据进行排序,您仍将在此处覆盖结果:
thrust::copy(d_vec.begin(), d_vec.end(), h_vec.begin());
(将CW标记为Jared Hoberock指出的关键问题)将文件扩展名更改为
.cu
,并使用nvcc
进行编译。一旦修复Jared指出的问题,您将需要更改此行,它将不会编译:推力::排序(h_vec.begin(),d_vec.end())代码>,可能最简单的方法就是删除它,因为它对给定的程序没有任何用处。如果您想保留它,请将d_vec.end()
更改为h_vec.end()
。考虑构建过程后,解决方案应该是显而易见的,只需将文件名的扩展名更改为.cu(感谢Jared)。感谢您指出了o型。将文件扩展名更改为.cu
,并使用nvcc
进行编译。一旦您解决了Jared指出的问题,您将需要更改这一行,它将无法编译:推力::排序(h_vec.begin(),d_vec.end())代码>,可能最简单的方法就是删除它,因为它对给定的程序没有任何用处。如果您想保留它,请将d_vec.end()
更改为h_vec.end()
。考虑构建过程后,解决方案应该是显而易见的,只需将文件名的扩展名更改为.cu(感谢Jared)。谢谢你也指出了o型。