2016-06-25 24 views
-2

私はC++でコーディングしていますが、私はMatrixVectorを乗算する必要があります。どちらも私が定義したクラスであり、どちらも1-D std::vectorです。データタイプはlong long intです。
私はすでにコードをstd::thread sと並列化しましたが、今は自分のNVIDIA GPUを利用して、CUDAで乗算をコードしたいと思います。私の手をできるだけきれいに保つために、そのようなアルゴリズムを実装しているライブラリが存在し、簡単に使えるかどうか知っていますか?私はそこに推力されているが、this exampleから、私が探しています正確に何を思われない、代わりに私はあまりのために何か並列乗算ベクトル行列

std::vector vec = ...; 
std::vector mat = ...; 
xyz::vector devVec = moveToGPU(vec); 
xyz::matrix devMat = moveToGPU(mat); 
xyz::vector devRes = multiply(devVec, devMat); 
std::vector res = moveToCPU(devRes); 

などを求めていますされるであろう見たことがありますか?

+0

「ライブラリが存在するかどうか知っていますか?」「[this](http://stackoverflow.com/help/on-topic)を読むことをお勧めします。ブック、ツール、ソフトウェアライブラリ、チュートリアル、その他のオフサイトリソースは、スタックオーバーフローのトピック外です。 " –

答えて

3

mat-vecの乗算は、標準BLASの操作です。ただし、データタイプは標準のものではありません(floatまたはdouble)。したがって、データをdoubleに変換するのに最適な選択ではない場合があります。gemv()のようなBLASルーチンを使用し、結果をlong longに変換し直してください。

また、独自のCUDAカーネルを作成するか、Thrustを使用して、カーネルコードの作成を避けることができますが、パフォーマンスは低下します。 this exampleから始めることができます。マトリクスを行列ごとに合計して列ベクトルにする方法は、行列と行列の要素ごとの乗算を終えた後のmat-vec-mul演算の2番目のステップです。ベクター。

+0

OK、アドバイスありがとう! – minomic