0

大きな行列 (8192x8192) 用の組み込み関数を使用して、C++ で行列 - 行列 (32 ビット浮動小数点数) 乗算関数を作成しました。最小データ サイズは、すべての読み取りおよび書き込み操作で 32B です。

アルゴリズムをブロッキング アルゴリズムに変更して、8x8 ブロックを 8 つの YMM レジスタに読み込み、ターゲット ブロックの行 (ターゲットとして別の YMM レジスタ) で乗算を実行し、最終的に 8 つの結果を別のレジスタに蓄積してメモリに格納します。

質問:連続していないアドレスから 32B チャンクを取得しても問題ありませんか? 次のように読むと、パフォーマンスが大幅に変わりますか?

Read 32B from p, compute, read 32B from p+8192 (this is next row of block), compute,
Read and compute until all 8 rows are done,  write 32B to target matrix row p3

それ以外の

Read 32B from p, compute, read 32B from p+32, compute, read 32B from p+64......

キャッシュではなく、メモリの読み取り速度を意味します。

注: fx8150 を使用していますが、1 回の操作で 32B 以上を読み取れるかどうかはわかりません。

4

1 に答える 1

1

1 つの連続したバッファーを使用すると、パフォーマンスが向上する可能性があります (少なくとも、悪くはありません!)。

パフォーマンスの違いの大きさは、多数の要因によって異なります (もちろん、32 バイト ブロックを大量に割り当てると、メモリの塊が「密集」する可能性が非常に高くなるため、キャッシュの利点は引き続き得られます)。最悪のケースは、すべてのブロックがメモリの異なる 4KB セグメントにある場合ですが、各ブロック間に数バイトの「空きスペース」があれば、それほど大きな問題ではありません。

他の多くのパフォーマンスに関する質問と同様に、コードが何をするか、メモリの種類、プロセッサの種類などの正確な詳細に関係することは非常に多くあります。実際に確認する唯一の方法は、さまざまなオプションをベンチマークする必要があることです...

于 2013-07-27T20:39:09.020 に答える