ループ交換と添字: マトリックス乗算

ループ交換には、ベクトル化できるユニットストライド構造が必要です。一般に、マトリックス乗算 (行列積) は下の例のように記述します。

例: 一般的なマトリックス乗算

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];

}

依存関係があるため、交換は常に可能であるとは限りません。依存関係によって異なる結果になる可能性があります。