大きな行列 (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 以上を読み取れるかどうかはわかりません。