次の方法で共有


シリアル化

このトピックを使用すると、スレッドのシリアル化とは何かを理解し、並列処理が実行されていない箇所をコード内で特定することができます。 スレッドのシリアル化は、異なるスレッドで発生してる処理が特定の順番で実行される必要がある場合に発生します。 これは多くの場合、特定のスレッドの処理で、別のスレッドでの処理が先に完了することが求められている場合に発生します。

パフォーマンスの観点から、スレッドのシリアル化はスレッドのロックの一形態とみなされます。 このパターンは多くの場合、シングル スレッドのアルゴリズムがマルチスレッドのアルゴリズムへ変換されたものの、マルチスレッド アルゴリズムの各箇所はその前の箇所が完了してからでないと開始できない場合に発生します。 ジョブ システム内のジョブ間に高い依存関係が存在する場合にも同様の結果となります。 これは、次の問題の発生原因となる場合があります。

  • 処理が並列で実行されておらず、一度に 1 つのスレッドにおいてのみ実行されている場合、このアルゴリズムは実質的にはシングル スレッドのままで、処理速度がこれ以上高まることはありません。

  • スレッド間の切り替えによる追加のオーバーヘッド。

スレッドのロック」に記載されているのと同じ手順を使用して問題をトラブルシューティングします。スレッド間または CPU コア間で階段効果が発生している場所に注目します。

PIX

図 1 は、PIX タイムラインでの階段効果の様子を示しています。

図 1: PIX タイミング キャプチャのスレッド タイムラインでの階段効果パターン

PIX タイミング キャプチャのスレッド タイムラインでの階段効果パターンのスクリーンショット

タイトルに処理をスピン待機するコードが含まれて場合、または、処理に必要なコードの箇所に対してタイトルがロックを取得しようとする場合、スピンの周囲に PIX イベントを追加してその箇所を取得すると便利です。 これらのイベントを追加することでスレッドの動作の特定が簡単になり、PIX のこれらのイベントを検索することにより、待機時間が過剰に長くなる箇所を特定できます。 スピンのケースに関する詳細については、「Core utilization: spinning (コア使用率: スピン)」を参照してください。

注意

コンテキスト スイッチが選択されている場合、[要素の詳細] ウィンドウ (「スレッドのロック」に示されています) を使用して、スレッドのシリアル化を引き起こしている正確なコード行を特定できます。

Windows Performance Analyzer (WPA)

図 2 は、スレッドが並列実行しない場合の様子を示しています。

図 2: スレッドが並列に実行していない場合の階段効果を示している [Timeline by Process, Thread] (プロセスとスレッドごとのタイムライン) ウィンドウ

スレッドが並列に実行していない場合の階段効果を示している [Timeline by Process, Thread] (プロセスとスレッドごとのタイムライン) ウィンドウのスクリーンショット

タイトルに作業を探している間にスピンするワーカー スレッドがある場合は Event Tracing for Windows (ETW) イベントを追加すると便利です。 例については、図 3 を参照してください。 ETW の追加の詳細については、「CustomEventProvider のサンプル」を参照してください。 (Microsoft Game Development Kit (GDK) のサンプルをダウンロードするには 「Xbox 開発者向けダウンロード」を参照してください。 ワーカー スレッドのスピン ブロックと処理ブロックの周囲にイベントを追加する必要があります。 WPA の [Generic Events Activity by Provider, Task, Opcode (プロバイダー、タスク、オペコードごとの汎用イベント)] ウィンドウには、各イベントの発生時点が表示されます。 過剰なスピンが発生しているスレッドを特定するには、「Core utilization: spinning (コア使用率: スピン)」を参照してください。

図 3: CustomEventProvider サンプルからのカスタム ETW イベントを示す [Generic Events (汎用イベント)] ウィンドウ

CustomEventProvider サンプルからのカスタム ETW イベントを示す [Generic Events (汎用イベント)] ウィンドウのスクリーンショット