1

私は GPU プログラミングの初心者であり、特定の製品を GPU に移植する価値があるかどうかを判断しようとしています。アルゴリズムの主要なステップの 1 つは、多数のフロベニウス積の計算を必要とします(内積と同様ですが、行列上で、要素ごとの乗算とそれに続く積の合計です)。

データ構造は、すべてを GPU のグローバル メモリに格納できますが、共有メモリには格納できません。私の理解では、GPU は演算強度 (転送されるバイトあたりの浮動小数点演算) が高いときに最高のパフォーマンスを発揮し、ドット積はこの点で (比較的) パフォーマンスが低いということです。私はどれほど貧弱であるかを把握しようとしていますが、詳細のいくつかに混乱しています.

物事を具体的にするために、倍精度エントリの 64x64 行列があると仮定しましょう。(それらは倍精度でなければなりません。) 同様に、行列が正しく配置されるように配置されていると仮定しましょう。明らかに、SM ごとに 1 つのブロックであっても共有メモリに保存するには大きすぎます。したがって、私の考えは、問題を「並べて表示」し、各ブロックに各マトリックスの 16x16 タイルを格納することです。これで、少なくとも 8 つのブロックすべてを一度に操作したり、各製品にスレッドを割り当てたり、各ブロックの合計を計算したりできるようになりました。

私の質問は次のとおりです。

1) FLOPS/バイトとは正確には何を意味しますか? より正確には、このコンテキストでは、倍精度乗算に必要な FLOPS はいくつですか? 答えが 1 の場合、操作ごとに 16 バイトを移動しているように見えますが、これはひどいようです。

2) この計算は、結合されたメモリ読み取りのコンテキストで行われますか? 合体は私を助けますか、それとも私を傷つけますか?

そして、より漠然とした質問:

3) これはやる価値がありますか?

参考までに、私はベンチマークと実験用に GTX 580 と CUDA 4.2 にアクセスできますが、5.0 をインストールすることもできます。また、最近の Nvidia アーキテクチャがいくつかの点でより使いやすい場合、それを知ることも役に立ちますが、アクセスできない場合があります。

アップデート:

私はまだアルゴリズム全体に取り組んでいますが、CPU とやり取りすることなく、行列を生成して GPU のグローバル メモリに保持できると信じる強い理由があります。

合体したメモリアクセスを保証できるという私の仮定を再検討する必要があるかもしれません。行列の一部は、4 次元オブジェクトのスライスです。私の行列の約 3/4 は、明らかに結合された方法で自然にアクセスされますが、残りの 1/4 はそうではありません。ラージ オブジェクトを 2 回格納することで解決できるかもしれませんが、それによって新たな疑問が生じます。

4) 合体メモリのガイドラインは、共有メモリからグローバル メモリへの移動にも適用されますか?

4

1 に答える 1

3

1) 正しい。1 回 (倍精度) の乗算は 1 回の浮動小数点演算、つまり FLOP です。メモリから両方のオペランドをロードする必要がある場合、それは 1/16 FLOPS/バイトです。ただし、 m行列とn 個の他の行列の積が必要な場合は、理想的には ( m * n ) / (8 * ( m + n )) FLOPS/バイトが得られ、 mnが十分に大きい場合、算術的に激しい問題が発生します。

2) 合体メモリ読み取りは、指定されたメモリ帯域幅を (80% 近く) 達成するのに役立ちます。今のところ、実際にこれらを達成できると仮定すると、コンピューティング機能 2.0 GTX 580 のキャッシュがこれに大いに役立ちます。

3) 場合による。また、GPU は CPU の約 10 倍のメモリ帯域幅を備えているため、メモリにバインドされたタスクでも高速化できます。

4)はい、そうです(移動のグローバルメモリ側の場合)。共有メモリには、「バンク競合」を回避するためのさまざまなルールがあります。ただし、共有メモリへのアクセスはグローバル メモリへのアクセスよりも桁違いに高速であるため、今は気にしないでください。問題になるのはほとんど後者だけです。

最も重要な要素は、乗算する必要がある行列がどこから来るのかということです。それらがホストから来て、PCIe を介して転送する必要がある場合、それは損失であり、積は CPU でより適切に計算する必要があります。GPU で行列を生成できる場合は問題なく、より高いメモリ帯域幅から利益を得ることができます。マトリックスをオフチップ メモリに保存することなく、オンザフライで内積を計算できる場合は、GPU が最適です。それは行列をどれだけ効率的に計算できるかに依存しますが、内積はおそらくそれに対する小さな「余波」にすぎません。積の計算が最も時間のかかるステップであると本当に確信していますか?

于 2013-06-05T01:19:35.417 に答える