非常に小さなサイズの行列 (サイズ - 10x10) をベクトルで 50000 から 100000 倍 (それ以上になることもあります) 乗算する必要があります。これは、1000 の異なるマトリックスで発生します (それ以上になる可能性があります)。CUDAでこの操作を行うことで、パフォーマンスが大幅に向上しますか?
3 に答える
はい、これは GPU にとって理想的なタスクです。
If you want to multiply a single matrix with a vector 50K times and each multiplication is prerequisite to the previous then don't use CUDA. It's a serial problem, best suites for CPU. However if each multiplication is independent you can multiply them simultaneously on CUDA.
The only case where your program will give tremendous speedup is when each vector multiplication iteration is independent to the data of other iterations. This way you'll be able to launch 50K or more iterations simultaneously by launching equal number of threads.
正確に何をしているかにもよりますが、これは GPU で非常に迅速に実行できますが、優れたパフォーマンスを得るには独自のカーネルを実行する必要がある場合があります。
あなたの問題についてもっと知らなければ、私はあなたにあまりアドバイスをすることはできません. しかし、私は解決策を推測することができました:
1 つのベクトルを取り、それを同じ行列で数千回乗算する場合、行列の閉じた形式を任意のべき乗で見つける方がはるかに優れています。これは、ケイリー・ハミルトンの定理またはヨルダンの正準形を使用して行うことができます。
簡単なグーグルでこれの実装を見つけることができないようですが、これを1年生の線形代数で行ったことを考えると、それほど悪くはありません. ヨルダンの正規形に関するいくつかの情報と累乗への累乗は、http://en.wikipedia.org/wiki/Jordan_normal_form#Powersで見つけることができます。その変換行列は固有ベクトルの行列であり、その逆行列です。マトリックス。
行列 A があるとします。Jordan 標準形 J と、変換行列 P、P^-1 が見つかります。
A^n = PJ^n P^-1
これの実装への適切なリンクを見つけることができないようですが、10x10 行列の閉じた形式を計算すると、50,000 回の行列乗算よりも大幅に時間がかかりません。そして、これを実装すると、おそらく CPU 上ではるかに高速に実行されるでしょう。
これが問題である場合は、これを調べる必要があります。