2012-04-07 14 views
3

非常に小さいサイズの行列(サイズ - 10x10)にベクトルを何倍か50000〜100000倍(それ以上でもかまいません)しなければなりません。これは1000個の異なる行列で起こります(はるかに多いかもしれません)。 CUDAでこの操作を行うことで、パフォーマンスが大幅に向上しますか?ここでCUDAを使うべきですか?

+1

複数のgemv操作を同時に実行できますか?これは、GPUが何らかの利益をもたらすかどうかを知るための鍵となります。 – talonmies

答えて

4

はい、これはGPUにとって理想的な作業です。

1

単一の行列にベクトルを50K倍乗算し、各乗算が前提条件となる場合は、CUDAを使用しないでください。これはシリアルの問題で、CPUに最適なスイートです。ただし、各乗算が独立している場合は、CUDAで同時に乗算することができます。

プログラムが非常に高速化する唯一のケースは、各ベクトル乗算の反復が他の反復のデータとは独立している場合です。これにより、同じ数のスレッドを起動することで、50K回以上の繰り返しを同時に開始することができます。

+0

行列の乗算は結合的です。 –

+2

これはdownvote IMOに値するものではありませんでした。 Jawadは、 "もし"と言った。私は自分の答えで、BLAS型のベクトル行列の乗算についての質問であると仮定しました。もちろん、実際には、同じベクトルで50k回行列を掛ける必要がある場合は、ベクトルの指数関数を取得して1回の乗算を行うことができます。 –

1

正確に何をしているのかによって、これはGPU上で非常に速く行うことができますが、自分のカーネルを使ってパフォーマンスを向上させる必要があります。

あなたの問題について詳しく知りませんが、あまりにも多くのアドバイスをすることはできません。しかし、私は解を推測することができます:

ベクトルを1つ取り、それを同じ行列で数千倍にすると、閉じた行列の形を任意の力で見つける方がはるかに良いでしょう。これは、Cayley-Hamilton定理またはJordan正規形式を使用して行うことができます。

私は速いグーグル・グーグルからこの実装を見つけることはできませんが、私は初年度の線形代数でこれを行ったと考えても、それほど悪くはありません。ヨルダンの正規形に関するいくつかの情報は、それを力に上げることはhttp://en.wikipedia.org/wiki/Jordan_normal_form#Powersにあり、その変換行列は単なる固有ベクトルの行列とその行列の逆行列です。

を使用すると、行列Aを有し、そしてあなたがジョルダン標準形のJを見つけると言う、そして変換がP、P^-1行列は、

A^N = PJ^N P^-1

を見つけます。

私はこの実装に適したリンクを見つけることはできませんが、10x10の行列の閉じた形式の計算は、50,000の行列の乗算よりも大幅に時間がかかりません。そして、これはおそらくCPU上でより速く実行されます。

これが問題ならば、これを調べる必要があります。

関連する問題