JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.3: C ユーザーガイド     Oracle Solaris Studio 12.3 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  C コンパイラの紹介

2.  C コンパイラ実装に固有の情報

3.  C コードの並列化

3.1 並列化の概要

3.2 OpenMP に対する並列化

3.2.1 OpenMP の実行時の警告の処理

3.2.2 環境変数

3.2.3 並列コードでの restrict の使用

3.3 データの依存性と干渉

3.3.1 並列実行モデル

3.3.2 固有スカラーと固有配列

3.3.3 ストアバック

3.3.4 縮約変数

3.4 処理速度の向上

3.4.1 アムダールの法則

3.4.1.1 オーバーヘッド

3.4.1.2 ガスタフソンの法則

3.5 負荷バランスとループのスケジューリング

3.5.1 静的 (チャンク) スケジューリング

3.5.2 セルフスケジューリング

3.5.3 ガイド付きセルフスケジューリング

3.6 ループの変換

3.6.1 ループの分散

3.6.2 ループの融合

3.6.3 ループの交換

3.7 別名と並列化

3.7.1 配列およびポインタの参照

3.7.2 制限付きポインタ

3.8 メモリーバリアー組み込み関数

4.  lint ソースコード検査プログラム

5.  型に基づく別名解析

6.  ISO C への移行

7.  64 ビット環境に対応するアプリケーションへの変換

8.  cscope: 対話的な C プログラムの検査

A.  機能別コンパイラオプション

B.  C コンパイラオプションリファレンス

C.  ISO/IEC C 99 の処理系定義の動作

D.  C99 の機能

E.  ISO/IEC C90 の処理系定義の動作

F.  ISO C データ表現

G.  パフォーマンスチューニング

H.  Oracle Solaris Studio C: K&R C と ISO C の違い

索引

3.4 処理速度の向上

コンパイラがプログラムの大量の時間が消費される部分を並列化しない場合、速度の向上は発生しません。たとえば、プログラム実行の 5% 部分に相当するループしか並列化できない場合、全体的に速度を向上できる限界は 5% です。ただし、改善は、負荷のサイズと並列実行オーバーヘッドに依存します。

したがって、一般的な規則として、プログラムの並列化される部分が大きくなればなるほど、大幅な速度の向上を期待できます。

それぞれの並列ループは、起動時と終了時に小さなオーバーヘッドを招きます。起動時のオーバーヘッドには作業を分散するためのものがあり、終了時には、バリアでの同期によるものがあります。ループによって実行される作業量が比較的小さい場合には、速度の向上を期待できません。実際には、ループが遅くなる可能性さえあります。プログラム実行の大部分が大量の小さな並列ループで占められている場合には、プログラム全体の速度が上がる代わりに遅くなることがあります。

コンパイラは、いくつかのループ変換を実行することで、ループの規模を大きくしようとします。この変換には、ループの交換およびループの融合が含まれます。プログラム内の並列化が少ない場合や小さな並列領域に分割されている場合、速度の向上は通常は少なくなります。

問題サイズを大きくすると、多くの場合、プログラム内の並列化の分割が改善されます。たとえば、あるプログラムが順次実行する部分がプログラムサイズの 2 乗に増加し、並列化可能な部分が 3 乗に増加するものとします。この問題の場合、並列化部分の作業負荷は順次部分より速い速度で増加します。資源の限界に達しないかぎり、ある時点で問題の速度が向上します。

並列 C の利点を最大限に引き出すには、指令、問題のサイズ、およびプログラムの再構成に関して何らかのチューニングや実験を試みてください。

3.4.1 アムダールの法則

固定された問題サイズの速度向上は一般にアムダールの法則に従いますが、この法則は単純に、特定の問題での並列化速度向上の量は、問題の順次処理部分によって制限されると説明しています。次の式は問題の速度向上について説明しています。F が順次処理領域で費やされる時間の部分、時間の残りの部分が P 個のプロセッサの間で一様に費やされます。この式からわかるように、式の 2 番目の項の値がゼロになると、値が決まっている 1 番目の項によって全体的な速度の向上度が制限されます。

image:アムダールの法則を示す等式。S 分の 1 は F と P 分の 1 マイナス F に等しいです。

次の図に、この概念を示します。暗い陰影の付いた部分は、プログラムの順次部分を表しており、プロセッサ数が 1、2、4、8 個の場合でも一定のままです。明るい陰影の付いた部分はプログラムの並列部分を表しており、任意の数のプロセッサ間で均等に分散できます。

図 3-3 固定された問題の速度向上

image:プロセッサの数が増加するに従い、各プログラムの並列処理部分の所要時間は減少します。

プロセッサの数が増加するにつれ、各プログラムの並列処理部分の所要時間は減少していますが、各プログラムの逐次処理部分は同じままです。

ただし実際には、複数のプロセッサに対する通信と作業分散によりオーバーヘッドを招く場合があります。これらのオーバーヘッドは、使用される任意の数のプロセッサのために固定されない可能性があります。

次の図には、プログラムに逐次処理部分がそれぞれ 0%、2%、5%、10% 含まれる場合の理想的な速度向上が示されています。オーバーヘッドは想定されていません。

図 3-4 アムダールの法則による処理速度向上の曲線

image:グラフは、逐次処理部分のないプログラムでもっとも速度が上がることを示しています。

グラフは、オーバーヘッドがないと想定した場合、0%、2%、5%、および 10% の逐次処理部分を含むプログラムでの理想的な速度向上を示しています。横軸はプロセッサの数、縦軸は速度を表しています。

3.4.1.1 オーバーヘッド

モデルにオーバーヘッドの影響を取り入れると、速度向上の曲線は大幅に変わります。説明の目的のために、オーバーヘッドが 2 つの部分で構成されることを想定します: プロセッサの数に依存しない固定部分と、使用されるプロセッサの数に 2 乗で増加する固定でない部分です。

image:S 分の 1 は、{F プラス (1 マイナス P 分の F) プラス K1 プラス K2 P 二乗} 分の 1 に等しいです。

S 分の 1 は、{F プラス (1 マイナス P 分の F) プラス K1 プラス K2 P 二乗} 分の 1 に等しいです。

この式で K1 と K2 は一定の係数です。この仮定では、速度向上の曲線は次の図のようになります。この場合、速度向上はピークアウトします。特定のポイント後は、より多くのプロセッサを追加するとはパフォーマンスに悪影響を与えます。

図 3-5 オーバーヘッドがある場合の速度向上の曲線

image:グラフは、すべてのプログラムで 5 プロセッサのときにもっとも処理速度が速く、8 プロセッサまで増えると徐々に遅くなることを示しています。

グラフは、すべてのプログラムが 5 つのプロセッサで最大の速度向上に達し、最大の 8 個のプロセッサが追加されるとこの利点が失われることを示しています。横軸はプロセッサの数、縦軸は速度を表しています。

3.4.1.2 ガスタフソンの法則

アムダールの法則は、実際の問題で並列化速度向上を予測する場合に、誤った方向に導かれる可能性があります。プログラムの逐次処理部分に費やされる時間の割合は、問題のサイズに依存することがあります。つまり、次の例に示すように、問題のサイズを大きくすることで、速度向上の可能性が改善する場合があります。

例 3-12 問題サイズの拡大により速度向上の可能性が改善されることがある

/*
* initialize the arrays
*/
for (i=0; i < n; i++) {
    for (j=0; j < n; j++) {
            a[i][j] = 0.0;
            b[i][j] = ...
            c[i][j] = ...
    }
}
/*
* matrix multiply
*/
for (i=0; i < n; i++) {
    for(j=0; j < n; j++) {
            for (k=0; k < n; k++) {
                a[i][j] = b[i][k]*c[k][j];
            }
    }
}

理想的なオーバーヘッドゼロ、2 番目のループネストが並列で実行されることを想定します。問題のサイズが小さい場合 (つまり、小さい値の n)、プログラムの順次部分と並列化部分はそれほどかけ離れていません。ただし、n が大きくなると、並列実行部分に費やされる時間が順次実行の部分に対するものよりも早い勢いで大きくなります。この問題の場合は、問題のサイズが大きくなるにつれてプロセッサの数を増やすことは利点です。