2011-07-01 12 views
-2

私は 行列ベクトル乗算と加算の帯域幅を計算したいと思います:(A = M回N大を想定) Y = A * X + B正しい有効帯域をy = Ax + b?

しかし、私は読んで、書いたものについて少し混乱していますグローバルメモリから読み込まれたバイト数を数える:

は、効果的な帯域幅である:

bytesReadWrite = M*N (for reading A) + N(for read x) + M (for read b) + M(for write y) 

またはそれが

bytesReadWrite = M*N (for reading A) + M*N (for read x) + M (for read b) + M(for write y) 
です

xの場合はM * Nは基本的に各行のx全体を一度読み込むためです(共有メモリを使用する場合は、最終的にx行全体を一度読み込みます)

誰かに良いアドバイスがありますか正しい選択は何ですか?私は本当にこれを取得しないでください...

私は最初の計算を使用する傾向がありますが、なぜですか?それは理にかなっていますか?

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

+0

OK、行列のベクトル乗算を完了するための最小限の努力が含まれているので、最も意味のあるエフェクト帯域幅の計算が最初のものです... – Gabriel

答えて

1

これはほぼ確実です。メモリ帯域幅に関して、最新のプロセッサは、操作対象のすべてのアイテムをレベル2キャッシュに一度ロードし、そこから操作します。その後、変更されたアイテムのメモリに結果が書き戻されます。効果的に、あなたの帯域幅は、関連するすべての要素の総合計サイズにすぎません。注:これは単純化されたものでもありません。ストリーミングの効果は考慮されていないため、メモリのページ区切りはもちろんです。ストリーミングでは、大量のデータセット(たとえば、3Dグラフィックス計算)で単一のマトリックスを操作することは珍しいことではありません。その場合、行列はL2キャッシュにロードされ(おそらくそこからのレジスタへの合理的に最適化されたコードのために)、一度ロードされ、次にベクトルがロードされます。もう一度、現代のメモリページング技術を理解しなければ、モデルは実際には完全ではありません。行列とベクトルが異なるメモリページに格納されている場合、上記の巨大な違いがあります。 L2キャッシュに「ストリーミング」するためのベクトルのパックに深刻な最適化は言及されません。それでも、それは行列計算を実行するCPUモデルを前提としています。画像にGPUを持たせることで、物事が再び非常に劇的に変化します。

+1

私はCUDA GUIDに従ってみました。上記のように、私は、L2キャッシュやその他のことは起こっていないことを理解しています。それは、「効果的な」バンドであると言われていて、CUDAガイド... hmに従って最適化する必要があります。 – Gabriel

関連する問題