ループ タイリングまたはブロッキングを使用して 2 つの行列を乗算すると、実際に何が起こるかを (段階的に) 理解しようとしています。Fe http://en.wikipedia.org/wiki/Loop_tilingのコードが何をするか理解して います。ただし、キャッシュ内で何が起こっているかを想像することはできません。2 つの 4x4 行列を掛けたいとしましょう。AxB = C.
ここで、A と B ごとに 4 つの部分行列 (2x2) を作成したいと考えています。したがって、A = [A1 A2 ; A3 A4] および B = [B1 B2 ; B3 B4]。C のメモリ内のすべての要素はゼロに初期化されます。fe calloc を使用します。
1)行列が行優先の順序でメモリに格納されていると仮定しましょう:row1、row2、row3、row4 ...
2) それぞれ 4 つの行列要素を持つ 2 つのキャッシュラインがあるとします。そのため、c C[0,0] の最初の要素に対して単純な行列乗算を実行すると、i は A[0,0] のメモリ アクセスを持ち、行列の行全体をキャッシュラインにコピーします。次に、B [0,0] の 2 回目のメモリ アクセスがあります。次に、C[0,0] = A[0,0] * B[0,0] + C[0,0] です。次のステップは、C[0,0] = A[0,1] * B[1,0] + C[0,0] です。A[0,1] は最初のキャッシュ ラインにあるため、キャッシュ ヒットが発生します。ただし、B[1,0] は 2 番目のキャッシュ ラインになく、i はメモリ アクセスを行います。
この例ではループ タイリングが役に立ちますか? キャッシュ内で何が起こっているのか、なぜメモリアクセスが減少するのかを (段階的に) 説明できる人はいますか? この例が適切でない場合、ブロッキングの利点が見える例を誰か作ってもらえますか?
前もって感謝します。