並列処理アプリケーションをマルチスレッド化してパフォーマンスを向上させるのは骨の折れる作業です。コンパイラーを使用するとマルチスレッド・バージョンのアプリケーションを自動的に生成できます。使用してスレッド化することもできます。自動並列化により、安全かつ効率良く並列に実行できるループが検知され、マルチスレッド・コードが生成されます。プラグマを使用してプログラマー自身で並列化を表現できます。プラットフォーム向けにマルチスレッド・アプリケーションを効率的に開発するための手法について説明します。コンパイラーには、ループのデータフローを解析して、どのループが安全で効率良く並列に実行できるかを見極める機能があります。自動並列化により、マルチコアシステムでの実行時間が短縮されたり、次のような処理をプログラマーが行う必要もなくなります。コンパイルコマンドに追加するだけです。並列化を成功させるには次のセクションで説明する要件が前提となります。プログラムには、反復カウントの高いループが含まれています。C(N)ENDデータフローの解析では、ループにデータ依存がないことを確認します。コンパイラーは、実行時にスレッド間で、可能な限り反復を平等に分割するコードを生成します。環境変数を使用して設定することもできます。ループの並列化による速度向上は、処理量、スレッド間のロードバランス、スレッドの作成や同期化によるオーバーヘッドなどに左右されますが、一般的に使用されるスレッド数に応じて直線的に向上するわけではありません。(並列コンピューティングの文献でアムダールの法則の説明を参照してください)。つの要件が満たされなければなりません。ループは通常は並列化できない)。ループへのジャンプ、またはループからのジャンプがあってはならない。反復が実行される順序に論理的に依存してはなりません。同じデータが異なる順で追加された場合、蓄積される丸め誤差の変分はわずかです。配列を合計するようないくつかのケースでは、コンパイラーは単純な変換を行うことで明らかな依存性を排除できることがあります。ポインターや配列参照の潜在的なエイリアスも、安全な並列化にとっては一般的に知られている障害です。つのポインターが同じメモリーの場所を指す場合、両方のエイリアスが作成されます。つのポインターまたは配列参照が同じメモリーの場所を指しているかどうかを判断できません。(ただし、実行時にエイリアスを明示的にテストするための代替コードパスの生成が有益であると考えられる場合を除きます)。コンパイラーに指示することができます。コマンドライン・オプションを指定する方法もあります。コンパイラーは安全が確保されないループを並列化することはありません。コンパイラーは、相対的に単純な構造のループのみを効率的に解析できます。コンパイラーは関数呼び出しに依存性をもたらす副作用があるかどうかわからないため、外部関数の呼び出しを含むループのスレッド安全性を判断できません。属性を使用して、サブルーチンと関数に副作用がないことを表明できます。使用してプローシージャー間の最適化を起動する方法もあります。このオプションを使用すると、コンパイラーは呼び出された関数の副作用を解析できます。使用すると良いでしょう。行列乗算などの入れ子のループに有効です。適度な粗粒度の並列化は、外部ループのスレッド化に起因し、ベクトル化やソフトウェアのパイプライン化を使用して内部ループをより細かい粒度の並列化に最適化できるようにします。ループが並列化できる場合でも、常に並列化すべきであるとは限りません。コンパイラーは、しきい値パラメーターを使用したコストモデルで、ループを並列化するかどうかを決定します。