2012-04-12 10 views
1

CUDAデバイス上で配列の最小値または最大値を見つけるには、並列縮小を実行する必要があります。私は推力と呼ばれるこのための良い図書館を見つけました。ホストメモリ内の配列に対してのみ並列リダクションを実行できるようです。私のデータはデバイスメモリにあります。デバイスメモリのデータを減らすことは可能ですか? 私はこれを行う方法を理解することはできません。スラストのドキュメントはhttp://code.google.com/p/thrust/wiki/QuickStartGuide#Reductionsです。皆さんありがとう。デバイス内の配列を使用したCUDAでの並列削減

答えて

7

既にデバイスメモリにあるアレイの推力を減らすことができます。戻り値もdevice_ptrであることを

// assume this is a valid device allocation holding N words of data 
int * dmem; 

// Wrap raw device pointer 
thrust::device_ptr<int> dptr(dmem); 

// use max_element for reduction 
thrust::device_ptr<int> dresptr = thrust::max_element(dptr, dptr+N); 

// retrieve result from device (if required) 
int max_value = dresptr[0]; 

注:あなたがする必要があるすべては、あなたがリンクしているウィキに示したのと同様に、thrust::device_pointerコンテナ内のデバイスのポインタをラップし、還元手順のいずれかを呼び出すですあなたがthrust::raw_pointer_castを使用して他のカーネルに直接それを使用することができますので、:並列化をthurst

int * dres = thrust::raw_pointer_cast(dresptr); 
1

推力または他のライブラリがあなたにこのようなサービスを提供していない場合でも、あなた自身がそのカーネルを作成することができます。

Mark Harrisには、並列削減とその最適化に関するチュートリアルがあります。 スライドに続いて、ニーズに合わせて実装して変更することは難しくありません。

+0

私が知っている、しかし、私が読んで、本当に速いです... – Hlavson