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

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

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

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

        }

    }

}