2016-05-08 15 views
0

推力装置ベクトルを使用しない通常のCUDAコードを使用してカーネルを作成しました。カーネルは、デバイス上の配列、例えば配列Xに格納されたいくつかの結果を出力します。私は今、Xを減らしたいと思います。最初にXをスラストにコピーせずにthrust :: reduction関数を使用する方法はありますか:: device_vector変数?device_vectorsを使用しないでCuda thrust?

答えて

3

これを行う伝統的な方法は、デバイスポインタをthrust::device_ptrにラップし、それを推力アルゴリズムに渡すことです。 Thrustのタグベースのテンプレートモデルは、コールで提供される入力シーケンスのタイプのためにデバイス実行が確実に行われます。

#include <thrust/device_ptr.h> 
#include <thrust/reduce.h> 

int* X; 
cudaMalloc((void **)&X, sizeof(int) * size_t(N)); 

// Do stuff with X 

thrust::device_ptr X_ptr(X); 
int result = thrust::reduce(X_ptr, X_ptr+N); 

実行ポリシーの概念が導入されました。これにより、device_ptrを使用してデバイスアドレスを明示的に折り返す必要がなくなります。だからではなく、あなたが持っているとどのコードスタイル推力のバージョンによって導かれるべきであるあなたがこれを行うことを選択する方法入力イテレータはデバイス上にあることを示していると

#include <thrust/reduce.h> 
#include <thrust/execution_policy.h> 

int* X; 
cudaMalloc((void **)&X, sizeof(int) * size_t(N)); 

// Do stuff with X 
int result = thrust::reduce(thrust::device, X, X+N); 

ような何かをするthrust::deviceポリシーに使用することができますあなたは好きです。

関連する問題