FORTRAN, C, C++の障害(実行結果の異常)について
翻訳時オプションとして最適化レベル-O3以上が有効な場合、実行結果に誤りが生じることがあります。
障害番号 | PH04880 |
システム | FX10, CX400 |
言語 | FORTRAN, C, C++ |
修正予定 | FX10 : 未定 CX400 : 2015/4 修正予定 |
現象と条件
以下の条件をすべて満たした場合、実行結果に誤りが生じることがあります。
- 以下の翻訳時オプションがすべて有効である。
- 1.1. "-O3"以上(*1)
- 1.2. "-Kunroll"(*2)
- ソースプログラムに、以下のいずれかを満たす多重ループが存在する。
- 2.1. 2重ループで外側ループは回転数が6回転以上、または不明である。
- 2.2. 3重以上のループである。
- 最内ループは回転数が5回転以下であることが明にわかっている。
- 条件3のループにはループ中で一定の値を加算または減算している変数が存在する。
- 条件3のループの前に条件4の変数の初期値の代入文が存在する。
- 条件3のループには条件4の変数の加減算以降に条件4の変数を添字とする配列に対しての代入が存在する。
- 条件3のループの後にif文が存在する。
- 条件7のifブロック内の文が実行される。
- 条件7のifブロック内に条件6で更新される配列要素の参照が存在する。 10.条件9の配列の添字は定数である。
*1: 翻訳時オプション-Kfastで-O3が誘導されます。
*2: 翻訳時オプション-O2以上で誘導されます。
<プログラム例>
do i=1,m !条件(2-1)
n = 0 !条件(5)
!ループA
do j=0,1 !条件(3)
n = n + 1 !条件(4)
b(n) = 1. !条件(6)
enddo
if (c(1) < 10) then !条件(7)、条件(8)
a(1) = b(1) !条件(9)、条件(10)
endif
enddo
原因
配列の添え字情報に対しての最適化処理に誤りがありました。
回避方法
以下のいずれかの回避方法を実施してください。 なお、実行性能に影響が少ない回避方法は c)またはd)となります。
a) 翻訳時オプション-O2以下を有効にする。
b) 翻訳時オプション-Knounrollを有効にする。
c) 翻訳時オプション-Koclを有効とし、かつソースプログラムの対象ループ(ループA)に !ocl nounrollを追記する。
d) ソースプログラムの条件(4)と条件(5)を下記のように書き換える。
do i=1,m
n = 1 !n=1に修正
!ループA
do j=0,1
!この行は削除
b(n) = 1.
n = n + 1 !加算、減算をここに移動
enddo
if (c(1) < 10) then
a(1) = b(1)
endif
enddo
チェックツール
SPC-243-1のチェックコンパイラのツールを以下に格納しました。
/center/local/chkcmp/SPC-243-1
+ FX10_check_compiler_cross ← FX10 クロス版
+ FX10_check_compiler_own ← FX10 オウン版
+ PCC_check_compiler ← CX400版
使用方法につきましては、各ディレクトリーのREADMEファイルの【スクリプトファイルを使用しない】をご参照してください。
→ 例題の-Y0オプションの /tmp/check_compiler の部分は、上記の格納ディレクトリーをご指定下さい。
使用例 (CX400の場合)
※プログラム「PH04880.c」についてはお客様のプログラムでチェックする必要がございます。下記はサンプルプログラム指定の場合となります。
[cx01 ~]$ ls -l /center/local/chkcmp/SPC-243-1/PCC_V10_checkcompiler/sample/PH04880.c
-rw-r--r-- 1 xxxxxx center 638 Nov 10 15:33 /center/local/chkcmp/SPC-243-1/PCC_V10_checkcompiler/sample/PH04880.c
[cx01 ~]$ cd /center/local/chkcmp/SPC-243-1/PCC_V10_checkcompiler/sample
[cx01 sample]$ fcc -O2 -Krdconv -Klib -Kunroll -Y0,/center/local/chkcmp/SPC-243-1/PCC_V10_checkcompiler/lib PH04880.c
***** PH04880 found ***** "PH04880.c", line 11
→ 該当する場合、上記、形式でメッセージが出力されます