7

Thrust ライブラリを使用してオブジェクトをソートすることは可能ですか? 私は次の構造体を持っています:

struct OB{
  int N;
  Cls *C; //CLS is another struct.
}

Nに従ってOBの配列をソートするために推力を使用することは可能ですか? スラストを使用してオブジェクトをソートする簡単な例を教えてください。スラストがそうできない場合、それを可能にする他の CUDA ライブラリはありますか?

4

5 に答える 5

17

推力::ソートのドキュメントは、比較演算子を受け入れることを示しています。それらので、それらがどのように定義され、使用されているかを参照してください。私はこれをテストしていませんが、例に基づいて、必要なのは次のような構造体だけです。

struct OBCmp {
  __host__ __device__
  bool operator()(const OB& o1, const OB& o2) {
      return o1.N < o2.N;
  }
};

次に、を呼び出しthrust::sort(obs.begin(), obs.end(), OBCmp())ます。

于 2011-03-18T21:18:20.343 に答える
6

構造体をファンクターとして使用して、特別な構造体定義を使用してオブジェクトをソートすることはできますが、ソート アルゴリズムを基数ソートからマージソートに変更する必要があります。基数ソートの速度は、マージソートよりも著しく高速です。したがって、推力を使用する場合は、可能な限り整数型をキー値として使用するようにしてください。

「thrust::sory_by_key(..)」関数を使用することをお勧めします。

構造体を AOS から SOA 構造に変更する必要があります。

struct OB{
  int N;
  Cls *C; //CLS is another struct.
}

struct OBs{
   int []Ns; -> thrust::device_vector<int> indices;
   Cls *C[]; -> thrust::device_vector<Cls> values;
}

sort_by_key でインデックスをソートすると、値はすでにソートされています。

thrust::sort_by_key(indices.begin(), indices.end(), values.begin());
于 2012-06-18T13:21:07.543 に答える
2

operator< をオーバーロードすることでオブジェクトを並べ替えることができます。例えば:

__host__ __device__ struct Color{
  double blue, green, red;
  double distance;
  void dist()
  {
    distance = sqrt(blue*blue + green*green + red*red);
  }
};

__host__ __device__ bool operator<(const Color &lhs, const Color &rhs) 
{
   return lhs.distance < rhs.distance;
}

int main(void)
{
   thrust::device_vector<Color> cd;
   thrust::host_vector<Color> ch;
   for (int i = 0; i<6; i++)
   {
      Color c;
      c.blue = rand()*255;
      c.green = rand()*255;
      c.red = rand()*255;
      c.dist();
      ch.push_back(c);
   }
   cd = ch;
   thrust::sort(cd.begin(), cd.end());
   ch = cd;
   return 0;
}

オブジェクトは距離の後にソートされます。

于 2013-03-25T16:08:18.980 に答える
-1

これまで、カスタム オブジェクトを並べ替えることができませんでした。キーベースのソートはできますが、言及した構造体のようなカスタムオブジェクトはできません。これを行うために利用できるオープンな CUDA ベースのアルゴリズムが他にもいくつかありますが、それらを機能させるには、いくつかの変更などが必要です。

于 2011-03-12T18:39:56.627 に答える
-1

Thrustはまだ試していませんが、 CUDPPにはcudppSortと呼ばれる同様のソート関数があります。cudppSort を使用して構造体を直接ソートすることはできません。整数または浮動小数点のみを処理できます。

したがって、構造体の配列を並べ替える 1 つの方法は、キー (構造体の) と値のインデックス配列を並べ替えることです。後で、並べ替えられたインデックス配列を使用して、構造体を最終的な並べ替えられた場所に移動します。cudppCompact 圧縮アルゴリズムでこれを行う方法については、こちらのブログ投稿で説明しています。この手法は、cudppSort にも似ているはずです。

于 2011-03-14T02:57:49.380 に答える