これは、未回答リストからこの質問を削除するためにここで提供された非常に遅い回答です。OPはすでに解決策を見つけていると確信しています(2012年5月以降:-))が、次のことが他のユーザーに役立つと思います。
@talonmies が指摘したように、この問題は、融合されたギャザー リダクションによって解決できます。ソリューションは確かにサーストのpermutation_iterator
とのアプリケーションですreduce
。は、配列内のインデックスに従ってpermutation_iterator
ターゲット配列を (暗黙的に) 並べ替えることができます。(暗黙的に) 並べ替えられた配列の合計を実行します。x
indices
reduce
このアプリケーションは、Thrust のドキュメントの一部であり、便宜上以下に報告されています
#include <thrust/iterator/permutation_iterator.h>
#include <thrust/reduce.h>
#include <thrust/device_vector.h>
// this example fuses a gather operation with a reduction for
// greater efficiency than separate gather() and reduce() calls
int main(void)
{
// gather locations
thrust::device_vector<int> map(4);
map[0] = 3;
map[1] = 1;
map[2] = 0;
map[3] = 5;
// array to gather from
thrust::device_vector<int> source(6);
source[0] = 10;
source[1] = 20;
source[2] = 30;
source[3] = 40;
source[4] = 50;
source[5] = 60;
// fuse gather with reduction:
// sum = source[map[0]] + source[map[1]] + ...
int sum = thrust::reduce(thrust::make_permutation_iterator(source.begin(), map.begin()),
thrust::make_permutation_iterator(source.begin(), map.end()));
// print sum
std::cout << "sum is " << sum << std::endl;
return 0;
}
上記の例では、map
が の役割を果たしindices
、source
が の役割を果たしx
ます。
コメントの追加の質問 (用語の数を減らして繰り返す) に関しては、次の行を変更するだけで十分です。
int sum = thrust::reduce(thrust::make_permutation_iterator(source.begin(), map.begin()),
thrust::make_permutation_iterator(source.begin(), map.end()));
に
int sum = thrust::reduce(thrust::make_permutation_iterator(source.begin(), map.begin()),
thrust::make_permutation_iterator(source.begin(), map.begin()+N));
N
インデックス配列の最初の用語のみを反復処理する場合map
。
最後に、ホストからの使用の可能性に関して、これはデバイス上に存在するベクトルであるため、最初にホストに移動するglobal_array
必要があることに注意してください。cudaMemcpyFromSymbol