2012-04-14 14 views
1

Iは以下のように行列に取り組ん4つのCUDAカーネルを有する:(最初のコンボリューションを除く)基本的にすべてのカーネル呼び出す複数のカーネル、グローバルメモリパフォーマンス - CUDA

convolution<<<>>>(A,B); 
multiplybyElement1<<<>>>(B); 
multiplybyElement2<<<>>>(A); 
multiplybyElement3<<<>>>(C); 

// A + B + C with CUBLAS' cublasSaxpy 

をすることにより、マトリックスの各要素の乗算を行います一定の値が固定メモリにハードコードされています(高速化のため)。

は私が

multiplyBbyX_AbyY_CbyZ<<<>>>(B,A,C) 

のようなものを呼び出すことにより、単一の一つにこれらのカーネルに参加すべきか?おそらくそれは助けないだろうが、私は私が正しく理解している場合あなたに三つの「multiplybyElement」カーネルをマージする必要がある場合は、あなたが求めている

+0

両方のバージョンをテストしてどちらが良いか確認できますか?とにかく、カーネルコールですでにメモリー内のデータを再利用しているため、パフォーマンスに違いがあるとは思えません。 – Tudor

答えて

0

全くわからないので

グローバルメモリがすでにデバイス上にある必要がありますそれらのカーネルのそれぞれが全体(異なる)行列を読み込み、各要素に定数を掛けて、新しいスケーリングされた行列を格納する。

これらのカーネルはメモリ帯域幅に束縛されている(実際には計算がなく、すべての要素に対して1つの乗算がある)と仮定すると、行列が小さい場合を除き、カーネルをマージすることによるメリットはありません。カーネルは直列(同じストリーム)で実行されるのでGPUの使用。

+0

CUBLASライブラリを使用して "A + B + C"文があっても有効です。 – paulAl

+0

あなたがcuBLASに電話をしたときに私のアドバイスが同じになることを意味しますか?はい。 – Tom

0

カーネルをマージするとメモリを1回しか通過できない場合、3倍のスピードアップが表示されることがあります。

固定値を前に乗算して、1つのカーネルで1回の乗算を行うことはできますか?

+0

悲しいことに、3つの異なる行列を3つの異なる行列で乗算する必要があります – paulAl

関連する問題