私は10個のアレイを持っています。並べ替えたいです。ただし、それらの要素の動作は同じであるため、計算を保存して1つだけを並べ替え、その他は並べ替えられた配列に基づいて並べ替えます。推力を使っています。それを行う最適な理由はありますか?前もって感謝します。
コメントから、私の提案は次のとおりでした。
thrust::sort_by_key
最初のデータセット(配列)で使用し、最初のデータセットをキーとして渡し、インデックスシーケンス(0、1、2、...)を値として渡します。次に、スラストギャザーまたはスキャッター操作で再配置されたインデックスシーケンスを使用して、残りの配列を再配置します。
要求に応じて、これが実際の例です。
$ cat t282.cu
#include <thrust/sort.h>
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust/copy.h>
#include <thrust/sequence.h>
#include <iostream>
#include <thrust/iterator/permutation_iterator.h>
#include <thrust/iterator/zip_iterator.h>
const size_t ds = 5;
typedef float ft;
int main(){
ft a1[ds] = {0.0f, -3.0f, 4.0f, 2.0f, 1.0f};
// data setup
thrust::device_vector<ft> d_a1(a1, a1+ds);
thrust::device_vector<ft> d_a2(ds);
thrust::device_vector<ft> d_a3(ds);
thrust::device_vector<ft> d_a2r(ds);
thrust::device_vector<ft> d_a3r(ds);
thrust::device_vector<size_t> d_i(ds);
thrust::sequence(d_i.begin(), d_i.end());
thrust::sequence(d_a2.begin(), d_a2.end());
thrust::sequence(d_a3.begin(), d_a3.end());
// sort
thrust::sort_by_key(d_a1.begin(), d_a1.end(), d_i.begin());
// copy, using sorted indices
thrust::copy_n(thrust::make_permutation_iterator(thrust::make_zip_iterator(thrust::make_tuple(d_a2.begin(), d_a3.begin())), d_i.begin()), ds, thrust::make_zip_iterator(thrust::make_tuple(d_a2r.begin(), d_a3r.begin())));
// output results
thrust::host_vector<ft> h_a1 = d_a1;
thrust::host_vector<ft> h_a2 = d_a2r;
thrust::host_vector<ft> h_a3 = d_a3r;
std::cout << "a1: " ;
thrust::copy_n(h_a1.begin(), ds, std::ostream_iterator<ft>(std::cout, ","));
std::cout << std::endl << "a2: " ;
thrust::copy_n(h_a2.begin(), ds, std::ostream_iterator<ft>(std::cout, ","));
std::cout << std::endl << "a3: " ;
thrust::copy_n(h_a3.begin(), ds, std::ostream_iterator<ft>(std::cout, ","));
std::cout << std::endl;
}
$ nvcc -o t282 t282.cu
$ cuda-memcheck ./t282
========= CUDA-MEMCHECK
a1: -3,0,1,2,4,
a2: 1,0,4,3,2,
a3: 1,0,4,3,2,
========= ERROR SUMMARY: 0 errors
$
ここでは、thrust::gather
orthrust::scatter
操作の代わりに、並べ替えを実行するために、単にaを使用thrust::copy_n
していthrust::permutation_iterator
ます。を使用して並べ替える残りの配列を結合しますthrust::zip_iterator
が、これが唯一の方法ではありません。
私は10アレイではなく、3アレイでそれを行っていることに注意してください。ただし、これはメソッドを説明する必要があります。10アレイへの拡張は、機械的なものでなければなりません。ただし、thrust::tuple
10項目に制限されているため、10〜11を超える配列の場合はメソッドを多少変更する必要があることに注意してください。変更として、thrust::copy_n
を使用するのではなく、配列を並べ替えるたびに1回、ループを呼び出すだけで済みますzip_iterator
。これが効率に大きな違いをもたらすとは思わない。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加