t-nissieの日記: g95の最適化-O1でBLAS/LAPACKをコンパイルするとZHEEVが刺さる件
日記 by
t-nissie
症状:g95 -O1でコンパイルしたBLAS/LAPACKのsubroutine ZHEEVをcallすると返ってこない。
g95 -O0と最適化をかけないと大丈夫。g77とifortでは最適化をかけても問題ない。
解析:gdbで実行、C-cで停止、btでバックトレース。gdbは6.3以降を使用のこと。
原因:浮動小数点数演算の性質を解析するための subroutine DLAMC1 (dlamch.f) で無限ループ
にはまっている。IntelのCPUでは倍精度浮動小数点数演算がレジスタ間では拡張精度で実行
されるが、最適化によりこれが顕在化し、上記解析がうまくいっていなかった。
対処:次のとおり1行書き足す:
--- dlamch.f.ORIGINAL 2006-11-13 19:32:00.000000000 -0500
+++ dlamch.f 2006-12-10 20:49:53.762957640 -0500
@@ -230,6 +230,7 @@
*
B = 1
C = DLAMC3( A, B )
+ C = DLAMC3( C, 0.0d0 )
*
*+ WHILE( C.EQ.A )LOOP
20 CONTINUE
蛇足:g95 -O0 -S add.f と g95 -O1 -S add.f とのadd.sを比較せよ:
! add.f -*-FORTRAN-*-
! Time-stamp: <2006-12-11 21:34:35 t-nissie>
! Author: t-nissie
!!
program opttest
implicit none
double precision a,b,c
double precision add
external add
c = add(a,b)
end program opttest
double precision function add(a,b)
implicit none
double precision a,b
add = a + b
return
end function add
g95 -O0と最適化をかけないと大丈夫。g77とifortでは最適化をかけても問題ない。
解析:gdbで実行、C-cで停止、btでバックトレース。gdbは6.3以降を使用のこと。
原因:浮動小数点数演算の性質を解析するための subroutine DLAMC1 (dlamch.f) で無限ループ
にはまっている。IntelのCPUでは倍精度浮動小数点数演算がレジスタ間では拡張精度で実行
されるが、最適化によりこれが顕在化し、上記解析がうまくいっていなかった。
対処:次のとおり1行書き足す:
--- dlamch.f.ORIGINAL 2006-11-13 19:32:00.000000000 -0500
+++ dlamch.f 2006-12-10 20:49:53.762957640 -0500
@@ -230,6 +230,7 @@
*
B = 1
C = DLAMC3( A, B )
+ C = DLAMC3( C, 0.0d0 )
*
*+ WHILE( C.EQ.A )LOOP
20 CONTINUE
蛇足:g95 -O0 -S add.f と g95 -O1 -S add.f とのadd.sを比較せよ:
! add.f -*-FORTRAN-*-
! Time-stamp: <2006-12-11 21:34:35 t-nissie>
! Author: t-nissie
!!
program opttest
implicit none
double precision a,b,c
double precision add
external add
c = add(a,b)
end program opttest
double precision function add(a,b)
implicit none
double precision a,b
add = a + b
return
end function add
g95の最適化-O1でBLAS/LAPACKをコンパイルするとZHEEVが刺さる件 More ログイン