OS スレッドの移行

同カテゴリーの次の記事

チューニング手法

この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「OS Thread Migration」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS 環境でも十分ご利用いただけます。また、構成は英語版のヘルプと同じ階層構造にしてあります。


今日の複雑なオペレーティング・システムは、アプリケーションのスレッド (ソフトウェア・スレッドとして知られる) をプロセッサー・コアへ割り当てるため、スケジューラーを使用します。スケジューラーは、システムステートやシステムのポリシーなど多くの異なる要素によって、物理コア上でのアプリケーション・スレッドの配置を決定します。ソフトウェア・スレッドは、スワップアウトされ待機状態となる前に、一定時間コア上で実行されます。ソフトウェア・スレッドは、ブロック化 I/O などいくつかの理由で待機状態となることがあります。可能であれば、ほかのソフトウェア・スレッドがそのコア上で実行の機会を与えられます。元のソフトウェア・スレッドが再び実行可能な状態になると、スケジューラーはそのスレッドを継続して実行するため、スレッドを別のコアへ移行する可能性があります。このソフトウェア・スレッドの移行は、すでにキャッシュにデータを取り込んでいるスレッドが関連性を失うと、長いデータアクセス・レイテンシーが必要となるため、新しいコンピューティング・アーキテクチャー上では問題となる可能性があります。この問題は、各プロセッサーがパフォーマンスの観点で大きな利点のある直接アクセスできるローカルメモリーを持つ、NUMA (Non-Uniform Memory Access) アーキテクチャーではさらに深刻です。NUMA アーキテクチャーでは、ソフトウェア・スレッドが別のコアへ移行すると、以前のコアのローカルメモリーに格納されているデータはリモートとなり、メモリーアクセス時間はかなり増加します。スレッドの移行はパフォーマンスに影響するため、アプリケーション内で発生しているかどうか特定することが重要です。

インテル® VTune™ Amplifier (GUI または amplxe-cl) を使用して、インテル® アーキテクチャー上で実行されるアプリケーションのソフトウェア・スレッドの移行を特定できます。OS スレッドの移行を特定するため、アプリケーションの Basic Hotspots (基本ホットスポット) 解析や Advanced Hotspots (高度なホットスポット) 解析を実行します。

GUI を使用してスレッドの移行を特定するには、[Core/Thread/Function/Call Stack (コア/スレッド/関数/コールスタック)] グループを選択します。
ソフトウェア・スレッド数を見るにはコアノードを展開します。ソフトウェア・スレッドの総数は、CPU がサポートするハードウェア・スレッド数より少ないか、同数とすることが一般的です。さらに、スレッドはコアをまたがって等しく配置される必要があります。想定以上のソフトウェア・スレッドが CPU コアで観察されると、アプリケーションのスレッドの移行が起こります。上記の例では、12 個の OpenMP* ワーカースレッドが core_8 上で実行されています (インテル® ハイパースレッディング・テクノロジー対応のインテル® Xeon® プロセッサー)。これはスレッドの移行を示します。
[Timeline (タイムライン)] ペインでスレッドの移行を解析するには、[Thread/H/W Context (スレッド/HW コンテキスト)] グループを選択します。

スレッドノードを展開して、このスレッドが実行された CPU 数を確認し、時系列でスレッドの実行を解析します。この例では、OpenMP* thread #0 は cpu_23 上で実行され、cpu_47 へ移行しています。

また、次のコマンドラインを使用してこの結果を直接見ることができます。

> amplxe-cl -group-by thread,cpuid -report hotspots -r  C:\test\omp -s "H/W Context" -q | less
Thread                  H/W Context  CPU Time:Self
------------------------------  -----------  -------------
OMP Worker Thread #5 (0x3d86)    cpu_0                0.004
matmul-intel64 (0x3d52)          cpu_1                0.013
OMP Worker Thread #15 (0x3d90)   cpu_10               2.418
matmul-intel64 (0x3d52)          cpu_10               2.023
OMP Worker Thread #8 (0x3d89)    cpu_10               0.687
OMP Worker Thread #13 (0x3d8e)   cpu_10               0.097
OMP Worker Thread #6 (0x3d87)    cpu_10               0.065
OMP Worker Thread #4 (0x3d85)    cpu_10               0.059
OMP Worker Thread #1 (0x3d82)    cpu_10               0.048
OMP Worker Thread #9 (0x3d8a)    cpu_10               0.034
OMP Worker Thread #11 (0x3d8c)   cpu_10               0.009

同様に、多数の OpenMP* ワーカースレッドが cpu_10 上で実行されていることが分かります。

スレッドの移行を排除する

スレッド・アフィニティーを設定することで、スレッドの移行の影響を排除できます。スレッド・アフィニティーは、特定のスレッドの実行をマルチプロセッサーの物理処理ユニットのサブセットに制限します。インテル® ランタイム・ライブラリーは、OpenMP* スレッドを物理処理ユニットへバインドする機能を提供します。インテルの OpenMP* ランタイムでは、KMP_AFFINITYKMP_PLACE_THREADS 環境変数を使用して、アプリケーションのスレッド・アフィニティーを設定することができます。

上位トピック: チューニング手法

関連項目

OpenMP* 解析 (英語)
OpenMP* 解析のデータを解釈する (英語)

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事

  • 非効率な同期非効率な同期 この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Inefficient Synchronization」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]
  • ハードウェア・イベントベースのスタック・サンプリングでアプリケーションのパフォーマンスを解析ハードウェア・イベントベースのスタック・サンプリングでアプリケーションのパフォーマンスを解析 この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Analyzing Application Performance with Hardware Event-based Stack Sampling」の日本語参考訳です。Windows* […]
  • ソースの表示ソースの表示 この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Viewing Source」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]
  • 解析結果の表示 この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Viewing Analysis Results」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]
  • ビューポイントビューポイント この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Viewpoint」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]