並べ替えられた配列のメンバーに関する最初のインデックスを計算するためにcudaを使用すると問題が発生しました。たとえば、並べ替えられた配列の1つに[1,1,2,2,5,5 、5]、私は0(1の最初のインデックス)、2(最初のインデックス2)、4(最初のインデックス5)を返す必要があります。この問題を解決するためのいくつかの並列方法がありますか?この操作を実行する並べ替えられた配列のインデックスについての並列計算
答えて
一つの可能な方法は次のようになります
adjacent difference方法は各サブシーケンスの開始を識別するために(各並列スレッドがその要素とその隣に見える)の使用。隣人と比較して差異のない要素は、部分配列の開始ではありません。隣接する要素と異なる要素は、サブシーケンスの開始(または終了、または開始+終了)を表します。
各サブシーケンスの開始が識別されたら、stream compactionメソッドを使用して、指定されたシーケンスを各サブシーケンスの開始を表す要素のシーケンスだけに縮小します。ストリーム圧縮も並行して行うことができ、典型的なアプローチでは、圧縮されたシーケンス内の各要素の宛先アドレスを識別するために、パラレルプレフィックス和を使用することを含む。
上記のアルゴリズムの最初の部分は、CUDAコードを直接書くのはかなり簡単です。 2番目の部分は少し複雑です。なぜならparallel prefix sumは少し書くのが難しいからです。さらに、並列プリフィックス和、並列縮小、並べ替えなどのアルゴリズムに対しては、私はを返すことはありません。はゼロからこれらを書くことをお勧めします。可能であれば、常にライブラリの実装を使用する必要があります。
したがって、the thrust libraryは、CUDAの上に構築された、このようなソリューションのプロトタイプを作成するのは簡単なアプローチを可能ルーチンのセットを提示:
$ cat t1200.cu
#include <thrust/device_vector.h>
#include <thrust/copy.h>
#include <thrust/adjacent_difference.h>
#include <thrust/iterator/counting_iterator.h>
#include <iostream>
typedef int mytype;
using namespace thrust::placeholders;
int main(){
mytype data[] = {1,1,2,2,5,5,5};
int dsize = sizeof(data)/sizeof(data[0]);
thrust::device_vector<mytype> d_data(data, data+dsize);
thrust::device_vector<mytype> d_diffs(dsize);
thrust::adjacent_difference(d_data.begin(), d_data.end(), d_diffs.begin());
thrust::device_vector<int> d_result(dsize);
int rsize = thrust::copy_if(thrust::counting_iterator<int>(0), thrust::counting_iterator<int>(dsize), d_diffs.begin(), d_result.begin(), _1 > 0) - d_result.begin();
thrust::copy_n(d_result.begin(), rsize, std::ostream_iterator<int>(std::cout, ","));
std::cout << std::endl;
return 0;
}
$ nvcc -o t1200 t1200.cu
$ ./t1200
0,2,4,
$
に応じて処理する必要がある場合がありますさまざまなコーナーケースがあります。入力データの正確な構成。上記のコードは、可能な方法を示すための単純な例です。たとえば、ソートされたシーケンスの最初の要素がゼロまたは負の場合、上記のコードはわずかに変更する必要があります。入力データの最初の要素はで常にサブシーケンスの開始点であるため、copy_if
の使用の直前に、d_diffs
の最初の要素を正の値に設定する余分なコード行で扱うことができます。
- 1. 並べ替えの方法配列インデックスで並べ替えられたリスト
- 2. 配列の並べ替え
- 3. 並べ替えソート、ソートされた配列のインデックス0
- 4. Jsonpath並べ替え配列
- 5. トリム並べ替え配列
- 6. PHPインデックスを基にしたハッシュの配列の並べ替え
- 7. 指定された並べ替えオプションを使用して2つ以上の "列"(キー)に複数の配列の並べ替えを並べ替え
- 8. GAEデータストアで計算された列で並べ替え
- 9. 列を合計で並べ替え、同じ列を並べ替え
- 10. mysql_fetch_arrayの配列に並べ替え
- 11. numpyの配列に並べ替える
- 12. Javaでの並列配列の並べ替え
- 13. 並べ替えられたNumpy配列の元のインデックスを取得する
- 14. インデックス値から配列を並べ替える方法
- 15. 列に基づいた2D整数配列の並べ替え
- 16. 名前付きインデックスによる配列の並べ替え方
- 17. Rubyで並べ替えられた配列のインデックスを取得しますか?
- 18. アルファベット順の配列の並べ替え
- 19. アルファベット順の配列の並べ替え
- 20. カスタムクラスオブジェクトの配列の並べ替え
- 21. 2D Javascriptの配列の並べ替え
- 22. ナンディインデックスの並べ替えの配列
- 23. プロパティの配列の並べ替え
- 24. ポインタの配列の並べ替え
- 25. 4dのnumpy配列の並べ替え
- 26. Swiftで並べ替えられた配列の型
- 27. 並べ替えられたセットの "グローバル"計算
- 28. 多次元配列の並べ替え
- 29. オブジェクトの配列を並べ替える
- 30. XSLT配列の値を並べ替え
ソートされたデータをキーとしてスキャンを検討していました。これより速いかもしれません – talonmies