ループ交換には、ベクトル化できるユニットストライド構造が必要です。一般に、マトリックス乗算 (行列積) は下の例のように記述します。
例: 一般的なマトリックス乗算 |
---|
void matmul_slow(float *a[], float *b[], float *c[]) { int N = 100; for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) for (int k = 0; k < N; k++) c[i][j] = c[i][j] + a[i][k] * b[k][j]; } |
B(K,J) を使用するのは、ストライド-1 での参照ではないため、通常はベクトル化できません。
しかし、ループを交換すると、次の例に示すように、すべての参照がストライド-1 となります。
例: ストライド-1 でのマトリックス積 |
---|
void matmul_fast(float *a[], float *b[], float *c[]) { int N = 100; for (int i = 0; i < N; i++) for (int k = 0; k < N; k++) for (int j = 0; j < N; j++) c[i][j] = c[i][j] + a[i][k] * b[k][j]; } |
依存関係があるため、交換は常に可能であるとは限りません。依存関係によって異なる結果になる可能性があります。