2017-11-20 33 views
-1

私は完全にcudaで新しく、入力行列、畳み込み(またはフィルタ)と出力行列を与えられた畳み込みを計算するcudaカーネルを作成したいと思います。畳み込みのためのcudaカーネルの書き方は?

注:キューの各スレッドが出力行列の1つの値を計算するようにします。

どうすればいいですか?

+0

私が覚えている限り、CUDAウェブサイトには数多くの例がありました。特にコンボリューションは非常に一般的な作業であるという事実を考慮してください。これは変更されているか、そこに何も見つかりませんでしたか? – CWBudde

+0

@CWBuddeご意見ありがとうございます。はい、私はウェブサイト上の多くのハードケースと長い例のカップルを見つけましたが、私はまだ残念なことに簡単なものを見つけることはありません。あなたに何かがあるなら、私は幸せ以上になります。 – Bilgin

答えて

0

フィルタがマトリックスの塗りつぶし範囲をカバーする場合、それはcublasSgemmに直接変換できます。

例えば、行列の次元が5 * 4であり、130個のフィルタが必要であるとすると、訓練されるフィルタ行列は130 * 20の次元であり、5 * 4行列は20 *

このように、計算速度は最適です。 m1(130,20)とm2(20,1)の間の行列乗算に変換されます。

+0

あなたのコメントと例に感謝します。それは私にこの問題についてある程度の理解を与えました。これを行うためのcudaコードの例もありますか?可能であれば実際の例でどのように動作するか知りたいです。ありがとう – Bilgin

+0

私はいつも "JCuda"を使ってCudaライブラリを呼び出していますので、コードはCではありません。Web上のcublasSgemmの例とCudaマニュアルの例を確認できます。 sgemmを操作 'N'と 'N'で実行し、lda、ldb、ldcをそれぞれ130,20、および130に設定します。cublasSgemmメソッドの使用に慣れるには少し時間がかかります。ありがとう。 – Tom

+0

ありがとう。確かに私はチェックし、コード化し、私はあなたを更新します。 – Bilgin

0

イメージコンボリューションカーネルをお探しの場合は、このリンクが役立ちます(Two Dimensional (2D) Image Convolution in CUDA by Shared & Constant Memory: An Optimized way)。

私の知る限り、出力でピクセルまたは位置を計算するために各スレッドを使用するのは良い考えではないかもしれません。この畳み込みのサブ領域がどのようにロードされるか、または同じワープ内のスレッドが各読み取りで連続メモリを読み取っているかどうかを検討してください。そうしないと、数百ものスレッドが利用可能であっても、カーネルはデータの読み込みに苦しむ可能性があります。

したがって、基本的には、記述したコードを記述し、プロファイラ(nvvp)を使用してさらに最適化の提案を行うことができます。

+0

コメントと参考Webサイトをありがとう。私は、CUDAを使用してGPUで使用するための2次元畳み込みカーネルを作成することを探しています。最後に、私は自分のコードを入力、フィルター、出力マトリックスを印刷したいと思います。 – Bilgin

関連する問題