0

我只是尝试在我的 cuda 代码中添加 trust::sort ,但 nvcc 告诉我:

type_traits.h(322): error C2660: 'test' : function does not take 1 arguments
type_traits.h(322): error C2866:'thrust::detail::tt_detail::is_convertible_sfinae<From,To>::value' : a const static data member of a managed type must be initialized at the point of declaration

type_traits.h(355): error C2057: expected constant expressiontype_traits.h(363): error C2975: '__v' : invalid template argument for 'thrust::detail::integral_constant', expected compile-time constant expression
type_traits.h(363): error C2975: '__v' : invalid template argument for 'thrust::detail::integral_constant', expected compile-time constant expression

我已经搜索过了,但似乎没有人遇到和我一样的问题

我的代码中关于推力的部分:

#include <thrust\sort.h>

struct prepare_struct 
{
float xp;
float yp;
float zp;
float xs;
float ys;
float zs;
float sep;
int idSrc_idEve;
};

int compare_sort(prepare_struct &a, prepare_struct &b){ return a.sep > b.sep;}

void func(...){
...

prepare_struct* sPos_d;
checkCudaErrors( cudaMalloc((void**)&sPos_d, n*sizeof(prepare_struct) ) );

//a kernel that will fill sPos_d

thrust::sort(sPos_d, sPos_d + n, compare_sort);

...
}

如果我删除推力::排序(),它可以编译没有错误

我试过推力::device_vector,但它会得到同样的错误

raw_pointer_cast() 也会得到同样的错误信息

这是推力或 nvcc 内部的错误吗?

还是我的代码有问题?

环境:

win7 x64 与 2010 cuda 5.0 sm_20

device_vector 版本:

#include <thrust/device_vector.h>
void func(...){
...

thrust::device_vector<prepare_struct> sPos_dv(n_src_sta);
prepare_struct* sPos_d = thrust::raw_pointer_cast(sPos_dv.data());

//a kernel that will fill sPos_d

thrust::sort(sPos_dv.begin(),sPos_dv.end(),compare_sort);

...
}
4

1 回答 1

1

在 Stack Overflow 上写一篇文章时,请确保您提供了一个简短的、自包含的、正确的(可编译的)示例(又名 SSCCE)。这将使试图帮助您的其他成员的生活更轻松,并且还可以帮助您找到代码中的实际错误。如果您的代码不可编译,请提供一个演示编译问题的示例。

至于你的程序,肯定有你没有告诉我们的事情。Thrust 可以轻松处理您想要实现的目标,而不会出现任何错误。这是您的程序的修改(和完成)版本:

#include <thrust/sort.h>
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>

struct prepare_struct
{
  float xp;
  float yp;
  float zp;
  float xs;
  float ys;
  float zs;
  float sep;
  int idSrc_idEve;
};

struct prepare_struct_compare {
  __host__ __device__
  bool operator() (const prepare_struct& a, const prepare_struct& b)
  {
    return a.sep < b.sep;
  }
};

void initialize(thrust::host_vector<prepare_struct>& v)
{
  for(size_t i = 0; i < v.size(); i++)
    v[i].sep = v.size() - i;
}

void print(const thrust::host_vector<prepare_struct>& v)
{
  for(size_t i = 0; i < v.size(); i++)
    std::cout << " " << v[i].sep;
  std::cout << "\n";
}

int main ()
{
  const int n = 10;

  // Initialize vector of prepare_struct on host
  thrust::host_vector<prepare_struct> vec_h(n);
  initialize(vec_h);
  std::cout << "Initial vector:" << std::endl;
  print(vec_h);

  // Copy vector to device
  thrust::device_vector<prepare_struct> vec_d = vec_h;

  // Sort on device
  thrust::sort (vec_d.begin(), vec_d.end(), prepare_struct_compare());

  // Copy result back to host
  thrust::host_vector<prepare_struct> res_h = vec_d;
  std::cout << "Final vector:" << std::endl;
  print(res_h);
}

运行这个程序给我们:

Initial vector:
 10 9 8 7 6 5 4 3 2 1
Final vector:
 1 2 3 4 5 6 7 8 9 10
于 2013-05-14T11:17:04.023 回答