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);

...
}

Thrust::sort() を削除すると、エラーなしでコンパイルできます。

Thrust::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

スタック オーバーフローに関する投稿を書くときは、短い自己完結型の正しい (コンパイル可能) 例(別名 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 に答える