コンポーネント レベルのパフォーマンス状態の管理

Windows 10以降、電源管理フレームワーク (PoFx) を使用すると、ドライバーはデバイス内の個々のコンポーネントに対して個別に調整可能なパフォーマンス状態の 1 つ以上のセットを定義できます。 このドライバーは、パフォーマンスの状態を使ってコンポーネントのワークロードを調整し、現在のニーズに最適なパフォーマンスを提供します。

パフォーマンス状態の概要

Windows 8 と Windows 8.1 では、PoFx は、特定の F 状態に入ったときに電源とクロック レール ゲートによってコンポーネント レベルの電力を節約するためのアイドル状態 (F 状態) を提供します。 このモデルでは、コンポーネントがアイドル状態 (F0 以外) のときに電力を節約しますが、コンポーネントがアクティブなときに電力使用量を最適化したり、パフォーマンスのニーズとのバランスをとったりするためのメカニズムは提供されません。 コンポーネントが (F0 で) アクティブで要求を処理している場合でも、デバイスの完全なパフォーマンスを必要としない場合があります。 たとえば、グラフィックス カードは、点滅するカーソルのみを更新する必要があり、完全なパフォーマンスを必要としない場合があります。

可変パフォーマンス状態は、ドライバーがデバイスのコンポーネントを調整して、現在のニーズに十分なパフォーマンスを提供できるようにすることで、この問題に対処します。 Windows 8 および Windows 8.1 では、コンポーネントがパフォーマンス状態をサポートしている場合、各ドライバーはドライバーの内部にある独自のパフォーマンス状態選択アルゴリズムを実装する必要があります。必要に応じて、独自の方法でプラットフォーム拡張機能プラグイン (PEP) に通知します。 PEP は、プロセッサまたはシステム オン チップ (SoC) モジュールの特定の製品ラインに固有の電源管理タスクを実行するソフトウェア コンポーネントです。 ドライバー固有の独自のパフォーマンス状態ソリューションには、PEP と緊密に結合され、簡単にデバッグできないという欠点があります。

Windows 10以降、PoFx にはパフォーマンス状態管理用の API が用意されています。 この API には、主に 2 つの目的があります。

  • これは、PEP が適切なアクションを実行できるように、デバイス ドライバーがパフォーマンス状態の変更について PEP に通知するための標準的な方法を提供します。
  • これは、ドライバーごとにカスタム プラグインを必要とせずに、Windows パフォーマンス アナライザー (WPA) でのログ記録と分析のパフォーマンス状態の変更を OS に通知するための標準的な方法を提供します。

コンポーネント レベルのパフォーマンス状態の PoFX API の概要

PoFx を使用すると、デバイスは各コンポーネントに対して次の種類のパフォーマンス状態を定義できます。

  • 周波数 (Hz で測定)、帯域幅 (ビット/秒で測定)、または不透明なインデックス番号の単位で表される離散状態の数。
  • 最小値と最大値の間の状態の連続分布。

パフォーマンス状態はセットに編成され、コンポーネントごとに登録されます。 セット内のパフォーマンス状態は単調に増加する必要があります。 ほとんどのドライバーは、コンポーネントごとに 1 つのパフォーマンス状態セットを定義することが期待されます。 たとえば、ドライバーは、コンポーネントのクロック周波数を制御するために、パフォーマンス状態の 1 つのセットを定義できます。 ただし、一部のドライバーでは、コンポーネントのパフォーマンス状態の複数の次元を制御するために、複数のパフォーマンス状態セットを定義する必要がある場合があります。 たとえば、ドライバーは、クロック周波数とバス帯域幅を制御するために 2 つのパフォーマンス状態セットを定義できます。

PoFx によるパフォーマンス状態管理のためにデバイス コンポーネントを登録するには、ドライバーは次の一般的な手順に従います。

  1. ドライバーは、PoFx によって管理されるデバイス コンポーネントを登録します。 詳細については、「コンポーネント レベルの電源管理を参照してください。

  2. ドライバーは、PoFxRegisterComponentPerfStatesを呼び出すことによって、パフォーマンス状態のサポートを登録します。 登録呼び出しの一部として、ドライバーは、特定のコンポーネントのパフォーマンス状態を自分で定義するか、プラットフォーム拡張プラグイン (PEP) に従って代わりに定義することができます。

    デバイス ドライバーまたは PEP は、コンポーネントごとのパフォーマンス状態セットの数、パフォーマンス状態の種類 (不連続または範囲ベース)、実際のパフォーマンス状態の値と数の詳細など、パフォーマンス状態に関する知識を保持する必要があります。 PEP がパフォーマンス状態をサポートしていない場合でも、ドライバーは PoFx を使用してパフォーマンス状態のサポートに登録し、Windows パフォーマンス アナライザー (WPA) のログ記録と分析のためにパフォーマンス状態の変更を OS に通知する可能性があります。

    どちらの場合も、PoFxRegisterComponentPerfStatesが正常に完了すると、ドライバーには、登録されたパフォーマンス状態セットを含むPO_FX_COMPONENT_PERF_INFO構造体があります。

  3. ドライバーは、コンポーネントがパフォーマンス状態を変更する必要があると判断した場合、PoFxIssueComponentPerfStateChange PまたはPoFxIssueComponentPerfStateChangeMultipleを呼び出します。 PPoFx は、パフォーマンス状態の変更が完了すると、ドライバーが提供する ComponentPerfStateCallback ルーチンを呼び出します。

  4. ドライバーは、ComponentPerfStateCallbackルーチンによって、PEP がパフォーマンス状態の変更に成功したか拒否されたかが通知されます。 PEP が変更に成功した場合、ドライバーは、その観点からパフォーマンス状態を変更するために必要な作業を実行します。 PEP が変更を拒否した場合、ドライバーは何もしないか、同じパフォーマンス状態または別のパフォーマンス状態で要求を再試行するかを選択できます。

デバイス電源管理リファレンス