OpenMP* のサポート・ライブラリー

OpenMP をサポートするインテル(R) コンパイラーは、製品サポート・ライブラリー libguide.a (Linux* および Mac OS*) と libguide.lib (Windows*) を提供します。このライブラリーを使用して、アプリケーションを異なる実行モードで実行することができます。これは、すでにチューニングされているアプリケーションによる通常実行またはパフォーマンスが重要な実行において使用します。

サポート・ライブラリーは、デバッグすることが難しいパフォーマンス問題を回避するために、コマンドライン・オプションに関係なく、ダイナミックにリンクされます。

実行モード

OpenMP をサポートするコンパイラーは、ランタイム時に指定した実行モードでアプリケーションを実行することができます。このライブラリーは、シリアル (serial)、ターンアラウンド (turnaround) およびスループット (throughput) モードをサポートします。これらのモードは、実行時に kmp_library 環境変数を使用することによって選択されます。

シリアル

シリアルモードは、並列アプリケーションをシングル・プロセッサー上で強制的に実行します。

スループット

並列マシン上のロードが一定ではない、またはジョブストリームが予測できないマルチユーザー環境下では、スループット用にデザインおよびチューニングする方が良い場合もあります。これにより、複数のジョブを同時に実行した際の合計時間を最小限に抑えることができます。このモードでは、作業スレッドは追加の並行作業の待機中、他のスレッドへ作業を渡します。

スループット・モードは、プログラムにその実行環境を認知させ (つまりシステムの読み込み)、リソースの使用を調整することで、動的環境における効率の良い実行を行えるよう設計されています。このモードはデフォルトです。

1 つの並列領域の実行が完了すると、スレッドは新しい並列作業が使用可能になるまで待機します。その後一定期間が経過すると、スレッドが待機状態からスリープ状態に移行します。スリープ状態のスレッドは、追加の並列作業が使用可能になるまでの間、並列領域間で実行される非 OpenMP のスレッドコードか、他のアプリケーションによってのみ使用されることができます。スリープ状態に移行するまでの待機時間を設定するには、kmp_blocktime 環境変数または kmp_set_blocktime 関数を使用します。ブロック時間の値を小さくすると、並列領域間で実行される非 OpenMP スレッドコードを含むアプリケーションの場合には、全体的なパフォーマンスが向上します。ブロック時間の値を大きくすると、スレッドが OpenMP 実行専用に予約されている場合には適していますが、他の同時実行 OpenMP やスレッド・アプリケーションに悪影響を与える可能性があります。

ターンアラウンド

すべてのプロセッサーが、プログラムの全実行に対し排他的に割り当てられる専用 (バッチまたはシングルユーザー) 並列環境では、常にすべてのプロセッサーを効果的に利用することが最も重要です。ターンアラウンド・モードは、並列計算を行うすべてのプロセッサーをアクティブな状態で維持して、単一ジョブの実行時間を最小限に抑えるよう設計されています。作業スレッドは、追加の並列作業を他のスレッドにわたすことなく、アクティブな状態で待機します。

過剰なシステムリソースの割り当てを避けてください。過剰なシステムリソースの割り当ては、スレッドが多すぎるか、または実行時に利用可能なプロセッサーが少なすぎる場合に発生します。システムリソースが過剰に割り当てられると、このモードはパフォーマンスの低下を起こします。この問題が発生した場合、スループット・モードを使用してください。