Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何构建CUDA推力装置排序示例?_C++_Visual Studio 2010_Sorting_Cuda_Thrust - Fatal编程技术网

C++ 如何构建CUDA推力装置排序示例?

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:使用未定义的类型“

我正试图在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失败”

这是我正在使用的不会编译的示例代码,它主要来自于

但保留使用宿主向量的行:

  thrust::sort(h_vec.begin(), d_vec.end()); 
它编译并运行得很好,尽管排序似乎是在主机上运行的

如何编译和运行示例代码,以便在设备向量而不是主机向量上进行排序

我的系统配置包括:

  • 已安装Visual Studio 2010/SP1
  • Windows 7 pro,64位
  • CUDA 7.0开发工具包
  • NVIDA Quadro K4000配备最新驱动程序

正如@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指出的关键问题)

正如@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型。