你如何构建CUDA推力设备排序示例?

时间:2015-06-17 21:56:54

标签: c++ visual-studio-2010 sorting cuda thrust

我正在尝试使用CUDA的最新版本(7.0)和随附的THURST安装在Visual Studio 2010中构建和运行Thrust示例代码。我无法获得构建和运行的示例代码。

通过消除代码的一部分,我发现问题与thrust :: sort(..)调用有关。主机向量工作得很好,但设备向量会产生以下编译错误:

1> c:\ program files \ nvidia gpu computing toolkit \ cuda \ v7.0 \ include \ thrust \ system \ cuda \ detail \ sort.inl(203):error C2027:use of undefined type' thrust :: detail :: STATIC_ASSERTION_FAILURE'

这是我正在使用的示例代码,它不会编译,主要是在https://developer.nvidia.com/Thrust

的CUDA信任示例中
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/generate.h>
#include <thrust/sort.h>
#include <thrust/copy.h>
#include <algorithm>
#include <cstdlib>
#include <time.h>

int main(void)
{
   // generate 32M random numbers serially
   thrust::host_vector<int> h_vec(32 << 20);
   std::generate(h_vec.begin(), h_vec.end(), rand);

   // transfer data to the device
   thrust::device_vector<int> d_vec = h_vec;

   // sort data on the device (This breaks the compile)
   thrust::sort(d_vec.begin(), d_vec.end());

   // sort data on the host (This works just fine)
   thrust::sort(h_vec.begin(), d_vec.end());

   // transfer data back to host
   thrust::copy(d_vec.begin(), d_vec.end(), h_vec.begin());

   return 0;
}

玩弄我发现如果你注释掉使用设备矢量的行:

  // thrust::sort(d_vec.begin(), d_vec.end()); 

但保留使用主机载体的行:

  thrust::sort(h_vec.begin(), d_vec.end()); 

它编译并运行得很好,虽然排序似乎在主机上运行。

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

我的系统配置包括:

  • 安装Visual Studio 2010 / SP1
  • Windows 7专业版,64位
  • CUDA 7.0开发套件
  • 带有最新驱动程序的NVIDA Quadro K4000

1 个答案:

答案 0 :(得分:4)

正如@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());

(Jared Hoberock指出CW是关键问题)