LAPACK の DGETC2 が遅い件について
DGETC2 っていうのは、LAPACK の補助サブルーチンで、完全ピボット選択で LU 分解を行うやつです。
Fortran の 2次元配列は、メモリ上では列優先で A(1,1), A(2,1), ... A(1,2), A(2,2), ... と並んでいるため、2次元配列全体にメモリアクセスする場合、同じ列上にある A(1,I), A(2,I), ... に連続してアクセスした方がキャッシュメモリが効率よく扱え、高速に計算できるということは常識ですが、そ*1れにも関わらず、DGETC2 は行列上の最大要素を探すときに、
DO 20 IP = I, N DO 10 JP = I, N IF( ABS( A( IP, JP ) ).GE.XMAX ) THEN XMAX = ABS( A( IP, JP ) ) IPV = IP JPV = JP END IF 10 CONTINUE 20 CONTINUE
のように行方向に配列をたどっているわけです。
なぜ列方向にしないのか、っていうか IDAMAX (1次元配列上の絶対値最大の要素を探して、その位置を返す BLAS Level 1 の関数) を使わないのか。
もしかして誰も完全ピボット選択なんてしないのか。
*1:一行詩人の会々報 第十一号「うまい棒30本一気食いでトリップできることは常識ですが、そ」より