1

小さな行列とカーネルを使用して複数の畳み込みを実行する必要があり、GPU の多くのプロセッサを利用することで可能な限り高速に実行できるようになることを望んでいました。

問題は次のとおりです。多くの行列 (~1,000 から ~10,000) または比較的小さいサイズ (~15x15 から 1x1 - スカラーのように) と、特定の数の畳み込みマスク (~20 から 1) があります。各畳み込みマスクの例ですべての行列を畳み込む必要があります。

A; %5,000 matrices of size 10x10, A(i) = a 10x10 matrix
B; 10 matrices of size 5x5, B(k) = a 5x5 matrix
res(j)=conv(A,B(1)); %res(j) is the result of convolving all 5,000
%matrices in A by the j'th kernel B(j)

目標は res(1),...,res(10) をできるだけ早く計算することです

最も効率的なアルゴリズムを実装する方法についての提案を聞きたいです。FFT ベースの畳み込みはおそらく遅すぎるでしょう。

これまで見てきたすべての実装は、2 つの大きな行列を畳み込むことを意図した 2 次元畳み込み用でしたが、多くの小さな行列を畳み込む必要があります。

現在、CUDA プログラミングについてはほとんど知りませんが、学習中です。

私はこれを自分で理解したいと思っていましたが、時間の制約により、CUDA でコーディングする方法を学ぶ間、経験のある人にアドバイスを求めることを余儀なくされています。

ありがとうございました!

ps私の目的に合った実装へのポインタは大歓迎です。私は大学生で、これは小さな研究プロジェクトのためのものなので、お金を払う必要はありません...

4

2 に答える 2

2

私はあなたの質問に究極の答えを与えるつもりはありませんが、いくつかのことを指摘したいと思います:

  1. あなたが言及したように、最初の可能性はFFTアプローチを使用することです。この行の問題点は、(間違っていたら訂正してください)cuFFTライブラリは主に大きな行列に対処するように設計されているため、このアプローチから実りある利益を得るには、小さな行列に効率的な FFT ルーチンを開発することです。この種のアルゴリズムがいくつかあることを示したいだけです。たとえば、次の論文を参照してください: GPU 上の小さな離散フーリエ変換。指定されたタイプの小さな行列での CUDA FFT のパフォーマンスに関する直接的な経験はありませんが、マスク行列の数が少ない10ため(畳み込み数 ( 5000)。
  2. FFT アプローチを使用しないことに決めた場合、計算機能を備えた GPU アーキテクチャがあれば>=3.5動的並列処理は畳み込みを計算するための良い候補になる可能性があります。各畳み込み行列要素の評価を補間と見なす場合、サイズの補間問題が発生し15x15、動的並列処理が役立つ可能性があります。投稿を参照してください:大きな CUDA カーネルを分割し、動的並列処理を使用するメリット
于 2013-07-31T09:47:05.200 に答える
0

1 つのアプローチは、私が取り組んでいる ArrayFire のGFOR loopを使用することです。

次のように、GPU メモリが不足しない限り、必要な数の小さな畳み込みを 1 つの大きなカーネル起動に並べることができます。

array x = randu(5);      // the input
array y = randu(m,5);    // the output
array f = constant(1,3); // the kernel
gfor (array k, 0, m-1) {
    y(span,k) = convolve(x,f);
}

幸運を!

于 2013-08-01T03:11:28.267 に答える