FORTRAN, C, C++の障害(実行結果の異常)について

翻訳時オプションとして最適化レベル-O3以上が有効な場合、実行結果に誤りが生じることがあります。

障害番号 PH04880
システム FX10, CX400
言語 FORTRAN, C, C++
修正予定 FX10  :  未定
CX400 :  2015/4 修正予定

現象と条件

以下の条件をすべて満たした場合、実行結果に誤りが生じることがあります。

  1. 以下の翻訳時オプションがすべて有効である。
    • 1.1. "-O3"以上(*1)
    • 1.2. "-Kunroll"(*2)
  2. ソースプログラムに、以下のいずれかを満たす多重ループが存在する。
    • 2.1. 2重ループで外側ループは回転数が6回転以上、または不明である。
    • 2.2. 3重以上のループである。
  3. 最内ループは回転数が5回転以下であることが明にわかっている。
  4. 条件3のループにはループ中で一定の値を加算または減算している変数が存在する。
  5. 条件3のループの前に条件4の変数の初期値の代入文が存在する。
  6. 条件3のループには条件4の変数の加減算以降に条件4の変数を添字とする配列に対しての代入が存在する。
  7. 条件3のループの後にif文が存在する。
  8. 条件7のifブロック内の文が実行される。
  9. 条件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

→ 該当する場合、上記、形式でメッセージが出力されます