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

翻訳時オプション-Kparallel等複数の条件を満たした場合、実行結果異常となります。

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

現象と条件

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

  1. 翻訳時オプション-Kparallelが有効である。
  2. 翻訳時オプション-Kloop_part_parallelが有効である。または、最適化指示子 loop_part_parallel が有効である。
  3. whileループ、do-whileループ、またはif-gotoループが存在する。
  4. 条件3のループの終了条件は、以下の4.1~4.4に該当する。
    • 4.1. 条件3のループの終了条件は、変数と式を比較している。かつ、
    • 4.2. 条件4.1の変数は整数型である。かつ、
    • 4.3. 条件4.1の式は定数または、条件3のループで不変である。かつ、
    • 4.4. 条件4.1の変数はループ中で一定の値を加算または減算している。
  5. 条件3のループ制御変数(*1)の初期値は、条件3のループの直前で代入されている。
  6. 条件5の文の直前に、ループまたはif文が存在する。
  7. 条件5のループ制御変数は、条件3のループの終了後に参照される。
  8. 条件3のループ中に、自動並列化が可能な文が存在する。(ループの回転を跨いだデータ依存がない)
  9. 条件3のループ中に、自動並列化が不可能な文が存在する。(ループの回転を跨いだデータ依存がある場合など)
  10. 条件3のループはコンパイラの最適化によって部分的に並列化される。(*2)

*1:条件4の条件に該当する変数

*2:部分並列化が適用された場合、該当ループに対して翻訳時メッセージjwd5005p-iまたはjwd5016p-iが出力される。

<プログラム例>

if (x == 0) { }       /* 条件(6) */
i=1;           /* 条件(5) */
/* ループA */
while(i<100) {    /* 条件(3),(10) */
   a[i] = a[i]+1; /* 条件(8) */
   b[i] = b[i-1]+1; /* 条件(9) */
   i++;
}
printf("%d\n",i); /* 条件(7) */

原因

部分並列化の処理に誤りがありました。

回避方法

以下のいずれかの方法で回避できます。

a) 翻訳時オプション-Kloop_nopart_parallelを指定する。

b) 翻訳時オプション-Koclを指定し、かつ

ソースプログラムの対象ループ(ループA)に最適化指示子loop_nopart_parallelを追記する。