4

これは、プログラミングに関する概念的な質問です。

要約すると、2 つの配列/ベクトルがあり、1 つを並べ替える必要があります。そのため、arrayOne を並べ替えると、並べ替えのスワップごとに、同じことが arrayTwo に発生します。今、私は std::sort を使用すると比較関数を定義できることを知っています (私が想定しているカスタム オブジェクトの場合)。

だから私が望むのは、CUDAを使用して、ベクトルの1つの値に基づいて2つのベクトルをソートすることです。

これが私の不確実性が高まるところです。基本的には、Thrust ライブラリを使用して並べ替えを行いたいと考えています。カスタム比較関数の定義をサポートしていますか? もしそうなら、私はまだ arrayTwo の変更を伝播する方法を理解していません (CUDA ベースになるため)。

CUDA でカスタムの並列クイックソートを実装する時間がありません。

理由

基本的に、変数の配列の束に対して単一の配列に対してソートと計算を実行する必要があります (回帰木を考えてください)。当然のことながら、できるだけ早く行う必要があります。CPU ベースの並べ替えでは十分な速度が得られません。

#アップデート

ホストで2つを並べ替えるのに問題はありません.CUDAを使用するソリューションを探しています。ありがとう。

#更新 2

質問を投稿して以来、私は実際に幸運になり、解決策を見つけたと思います.Thrustは実際に私が探しているものをデフォルトで正確に提供することがわかりました:

#include <thrust/sort.h>
  ...
  const int N = 6;
  int    keys[N] = {  1,   4,   2,   8,   5,   7};
  char values[N] = {'a', 'b', 'c', 'd', 'e', 'f'};
  thrust::sort_by_key(keys, keys + N, values);
  // keys is now   {  1,   2,   4,   5,   7,   8}
  // values is now {'a', 'c', 'b', 'e', 'f', 'd'}

* http://code.google.com/p/thrust/wiki/QuickStartGuide#Fancy_Iteratorsから取得*

だから、今私がしなければならないのは、2 つの配列から 2 つの Thrust::device_vectors を取得することです (2D 配列から取得する必要があります)。幸せ。

4

1 に答える 1

1

{0、1、2、3など}に初期化された整数インデックスのベクトルを作成します。各整数は、ベクトル内の 1 つの位置を表します。インデックスを使用して vector1 を参照するカスタム比較関数を使用して、インデックスのベクトルを並べ替えます。終了したら、ソートされたインデックスを使用して vector1vector2 を並べ替えることができます。

しかし、この並べ替えをその場で行うことはできないと思うので、とにかくベクトルからベクトルにコピーする必要があるので、Kerrek の提案も良いと思います。

于 2011-08-12T10:41:58.520 に答える