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

一般に、マトリックス乗算 (行列積) は下の例のように記述します:

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

for(i=0; i<N; i++)

{

    for(j=0; j<n; j++)

    {

        for(k=0; k<n; k++)

        {

            c[i][j]=c[i][j]+a[i][k]*b[k][j];

        }

    }

}

b[k][j] の用法は、ストライドが1 ではないため、通常はベクトル化できません。ただし、下の例に示すように、そのループを交換すると、すべてのストライドが1 になります。

警告

依存関係のあるときは交換できないこともあり、交換してしまうと実行結果が異なる場合があります。

ストライドが 1 のマトリックス乗算

for(i = 0; i<N; i++)

{

    for(k=0; k<n; k++)

    {

        for(j=0; j<n; j++)

        {

            c[i][j]=c[i][j]+a[i][k]*b[k][j];

        }

    }

}