Thrust ライブラリを使用してオブジェクトをソートすることは可能ですか? 私は次の構造体を持っています:
struct OB{
int N;
Cls *C; //CLS is another struct.
}
Nに従ってOBの配列をソートするために推力を使用することは可能ですか? スラストを使用してオブジェクトをソートする簡単な例を教えてください。スラストがそうできない場合、それを可能にする他の CUDA ライブラリはありますか?
推力::ソートのドキュメントは、比較演算子を受け入れることを示しています。それらの例で、それらがどのように定義され、使用されているかを参照してください。私はこれをテストしていませんが、例に基づいて、必要なのは次のような構造体だけです。
struct OBCmp {
__host__ __device__
bool operator()(const OB& o1, const OB& o2) {
return o1.N < o2.N;
}
};
次に、を呼び出しthrust::sort(obs.begin(), obs.end(), OBCmp())
ます。
構造体をファンクターとして使用して、特別な構造体定義を使用してオブジェクトをソートすることはできますが、ソート アルゴリズムを基数ソートからマージソートに変更する必要があります。基数ソートの速度は、マージソートよりも著しく高速です。したがって、推力を使用する場合は、可能な限り整数型をキー値として使用するようにしてください。
「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());
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;
}
オブジェクトは距離の後にソートされます。
これまで、カスタム オブジェクトを並べ替えることができませんでした。キーベースのソートはできますが、言及した構造体のようなカスタムオブジェクトはできません。これを行うために利用できるオープンな CUDA ベースのアルゴリズムが他にもいくつかありますが、それらを機能させるには、いくつかの変更などが必要です。
Thrustはまだ試していませんが、 CUDPPにはcudppSortと呼ばれる同様のソート関数があります。cudppSort を使用して構造体を直接ソートすることはできません。整数または浮動小数点のみを処理できます。
したがって、構造体の配列を並べ替える 1 つの方法は、キー (構造体の) と値のインデックス配列を並べ替えることです。後で、並べ替えられたインデックス配列を使用して、構造体を最終的な並べ替えられた場所に移動します。cudppCompact 圧縮アルゴリズムでこれを行う方法については、こちらのブログ投稿で説明しています。この手法は、cudppSort にも似ているはずです。