OpenACCIntro
16/27 データ依存と並列化
【テロップ】
※各テロップ文字をクリックすると該当の場所がピンポイントで閲覧できます。
【ノート】
プラグマでの並列化の指示により、コンパイラはGPUを利用した並列化を行います。しかし、並列化してはいけない部分もそのままh並列化して実行するので気を付ける必要があります。ここでループ1とループ2を考えましょう。ループ1は配列要素xに10を加算するものですが、ループ2は一つ前の配列要素、すなわちxのiマイナス1に10を加算するものになっています。 ループ1を逐次で実行してみましょう。まず、 ★ 0番目の要素に10を加算するので、10のあたいになり、 ★ 次に、1番目の要素に10を加算するので、10のあたいになり、 ★ 以下同様に、全てのあたいは10になります。 これを並列に実行、つまり同時に実行すると、 ★ 逐次と同様に、全てが10になるので、ループ1では、逐次も並列も、計算結果は同じになります。 一方、ループ2ではどうでしょうか。 ★ 0番目の配列要素は計算をしませんので、あたいは0のままです。 ★ まず、1番目の配列要素は、0番目の配列要素のあたい、つまり0に10を加算するので、10のあたいになります。 ★ 次に、2番目の配列要素は、1番目の配列要素のあたいに10を加算しますが、 1番目のあたいは10になっているので、10を加算すると、20のあたいになります。 ★ さらに、3番目の配列要素は、2番目の配列要素のあたいに10を加算しますが、 2番目のあたいは20になっているので、10を加算すると、30のあたいになります。 以下、どうように、あたいは、10ずつ増えていくことになります。 一方、並列の場合は、 ひとつ手前の配列要素に10を加算するのですが、最初はすべてが0なので、 ★ 並列に、つまり同時に計算すると、計算結果は10となり、逐次の場合と計算結果が異なります。 ★ よって、ループ2は並列実行をすることができないことになり、オープンACCのプラグマを入れて並列実行するこは不可となります。 ★ このように、オープンACCでは、並列化が可能かどうかをユーザが判断する必要があるので、並列化の容易はあるものに、 注意してプログラミングする必要があります。 ★ なお、オープンACCには、パラレルプラグマ以外に、カーネルズプラグマというのがあり、パラレルプラグマに動作は似ています。 カーネルズプラグマであれば、並列化可能かどうかをコンパイラに判断させることができます。 しかし、どのような判断をするのか分かりにくい場合もあるので、 この資料では、パラレルプラグマを使う場合だけの説明にしています。