FORTRAN, C, C++の障害(実行結果の異常)について
翻訳時オプション-Kparallel等複数の条件を満たした場合、実行結果異常となります。
障害番号 | PH04155 |
システム | FX10, CX400 |
言語 | FORTRAN,C, C++ |
修正予定 | FX10: 未定 CX400: 2015/4 修正予定 |
現象と条件
以下の条件をすべて満たした場合、実行結果に誤りが生じることがあります。
- 翻訳時オプション-Kparallelが有効である。
- 翻訳時オプション-Kloop_part_parallelが有効である。または、最適化指示子 loop_part_parallel が有効である。
- whileループ、do-whileループ、またはif-gotoループが存在する。
- 条件3のループの終了条件は、以下の4.1~4.4に該当する。
- 4.1. 条件3のループの終了条件は、変数と式を比較している。かつ、
- 4.2. 条件4.1の変数は整数型である。かつ、
- 4.3. 条件4.1の式は定数または、条件3のループで不変である。かつ、
- 4.4. 条件4.1の変数はループ中で一定の値を加算または減算している。
- 条件3のループ制御変数(*1)の初期値は、条件3のループの直前で代入されている。
- 条件5の文の直前に、ループまたはif文が存在する。
- 条件5のループ制御変数は、条件3のループの終了後に参照される。
- 条件3のループ中に、自動並列化が可能な文が存在する。(ループの回転を跨いだデータ依存がない)
- 条件3のループ中に、自動並列化が不可能な文が存在する。(ループの回転を跨いだデータ依存がある場合など)
- 条件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を追記する。