2013-01-28 9 views
6

大きな行列のためにCUDAを使ってGPUで行列乗算を実装する必要があります。各マトリックスのサイズだけがGPUメモリよりも大きい。だから私はそれを効率的に行うアルゴリズムが必要だと思います。私はインターネットを回ったが、何も見つけられなかった。誰も私にそのようなアルゴリズムの名前やリンクを教えてもらえますか?gpuでの大きな行列乗算

ありがとうございました

+1

'[A0; A1] * [B0 B1] = [A0 * B0 A0 * B1; A1 * B0 A1 * B1] '?それはおそらく良いスタートです。 – kangshiyin

答えて

13

本当に正式なアルゴリズムはありません。一般的に、問題が全体としてメモリに同時に格納されない線形代数演算のこのような種類の演算は、「コア外」演算と呼ばれます。

これを解決するには、CUBLASライブラリと鉛筆とペーパーだけで、特に精巧なアルゴリズムは必要ありません。たとえば、あなたは次のように行列積に分解することができます:あなたは4独立したサブ行列の乗算演算を与える

enter image description here

。これらは、非常に直接的なホストコードを使用したCUBLAS gemmへの4回の呼び出しを使用して計算できます。問題のサイズとGPUの容量を合わせるのに必要な数の部分行列に考えを拡張することができます。同じ原則を使用して、複数のGPUで行列乗算問題を実装することもできます(例についてはthis questionを参照)。

ハーバードが開発したSciGPU-GEMMコードベースとHPL-CUDAリンパック実装(免責事項:私は後者のコードベースに関係しています)で、この正確なアイデアの実際の実装を見つけることができます。

+0

+1。分解はどこから生じたのですか?もちろん、素晴らしい答え! – Rekin

+1

@レキン:あなたが何を求めているのか分かりません。それの数学は私の頭部から来て、あなたが見る画像はLaTeXでgifにレンダリングされ、SO画像ホスティングサービスにアップロードされました。 – talonmies

+0

申し訳ありませんが、私は数式を参照していました。私は数回前に代数クラスを取りました。そして、大行列の乗算トピックは、計算上の問題解決のための最も問題の1つとして提示されました。それは不可能であるという誤った感情で私を残しました。 – Rekin