2

Thrust ライブラリを使用して、別の配列によってインデックス付けされた配列の要素を合計しようとしていますが、例が見つかりませんでした。つまり、Matlab の構文を実装したい

sum(x(indices))

これは、私が達成したいことを指摘しようとするガイドラインコードです。

#define N 65536

// device array copied using cudaMemcpyToSymbol
__device__ int global_array[N];

// function to implement with thrust
__device__ int support(unsigned short* _memory, unsigned short* _memShort)
{
   int support = 0;

  for(int i=0; i < _memSizeShort; i++)
        support += global_array[_memory[i]];

  return support;     
}

また、ホスト コードから、global_array[N]をcudaMemcpyFromSymbolでコピーせずに使用できますか?

すべてのコメント/回答は大歓迎です:)

ありがとう

4

1 に答える 1

2

これは、未回答リストからこの質問を削除するためにここで提供された非常に遅い回答です。OPはすでに解決策を見つけていると確信しています(2012年5月以降:-))が、次のことが他のユーザーに役立つと思います。

@talonmies が指摘したように、この問題は、融合されたギャザー リダクションによって解決できます。ソリューションは確かにサーストのpermutation_iteratorとのアプリケーションですreduce。は、配列内のインデックスに従ってpermutation_iteratorターゲット配列を (暗黙的に) 並べ替えることができます。(暗黙的に) 並べ替えられた配列の合計を実行します。xindicesreduce

このアプリケーションは、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が の役割を果たしindicessourceが の役割を果たし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

于 2014-03-26T22:15:23.597 に答える