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

マトリックス積は、一般に次の例のように記述されます。

DO I=1, N
 DO J=1, N  
   DO K=1, N  
     C(I,J) = C(I,J) + A(I,K)*B(K,J)

   END DO

 END DO
END DO

B(K,J) を使用するのは、ストライド-1 での参照ではないため、通常はベクトル化できません。しかし、ループを交換すると、次の「ストライド-1 でのマトリックス積の例」に示すように、すべての参照がストライド-1 となります。


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

ストライド-1 でのマトリックス積の例:

DO J=1,N
 DO K=1,N

   DO I=1,N
     C(I,J) = C(I,J) + A(I,K)*B(K,J)

   ENDDO

 ENDDO
ENDDO

詳細については、「コンパイラの最適化に関する文献」を参照してください。