组件级性能状态管理

从 Windows 10 开始,电源管理框架 (PoFx) 使驱动程序能够为设备中的单个组件定义一组或多组可单独调整的性能状态。 驱动程序可以使用性能状态来限制组件的工作负荷,以提供刚好足够的性能来满足工作负荷的当前需求。

性能状态概述

在Windows 8和Windows 8.1中,PoFx 提供空闲状态 (F 状态) ,以便在进入特定 F 状态时通过电源和时钟轨门控来节省组件级电源。 当组件处于空闲状态 (非 F0) 时,此模型可节省电源,但未提供任何机制来优化电源使用情况,或者在组件处于活动状态时根据性能需求进行均衡。 即使组件在 F0 中 (处于活动状态,) 并处理请求,它可能不需要设备的完整性能。 例如,图形卡可能只需要更新闪烁的光标,这可能不需要完全的性能。

可变性能状态通过允许驱动程序限制设备的组件来提供恰到其当前需求的性能来解决此问题。 在Windows 8和Windows 8.1中,如果组件支持性能状态,则每个驱动程序都必须实现驱动程序内部的专有性能状态选择算法,并根据需要以专有的方式通知平台扩展插件 (PEP) 。 PEP 是一种软件组件,用于执行特定于芯片 (SoC) 模块上的特定处理器或系统产品系列的电源管理任务。 特定于驱动程序的专有性能状态解决方案的缺点是与 PEP 紧密耦合,并且无法轻松调试。

从 Windows 10 开始,PoFx 提供用于性能状态管理的 API。 此 API 有两个main目标:

  • 它为设备驱动程序提供了一种标准方式,用于向 PEP 通知性能状态更改,以便 PEP 可以采取适当的操作。
  • 它为驱动程序提供了一种标准方法,用于向操作系统通知 Windows 性能分析器 (WPA) 中的日志记录和分析的性能状态更改,而无需为每个驱动程序使用自定义插件。

用于Component-Level性能状态的 PoFX API 简介

PoFx 使设备能够为每个组件定义以下类型的性能状态:

  • 以频率单位 (以 Hz) 度量的离散状态数、带宽 (以位/秒) 或不透明的索引数度量。
  • 状态在最小值和最大值之间的连续分布。

性能状态按集进行组织,并按每个组件进行注册。 集中的性能状态必须单调增加。 大多数驱动程序应为每个组件定义一组性能状态。 例如,驱动程序可以定义一组性能状态来控制组件的时钟频率。 但是,某些驱动程序可能需要定义多个性能状态集,以控制组件性能状态的多个维度。 例如,驱动程序可以定义两组性能状态来控制时钟频率和总线带宽。

若要注册设备组件以便通过 PoFx 进行性能状态管理,驱动程序遵循以下常规步骤:

  1. 驱动程序注册要由 PoFx 管理的设备组件。 有关详细信息,请参阅 组件级电源管理

  2. 驱动程序通过调用 PoFxRegisterComponentPerfStates 来注册对性能状态的支持。 作为注册调用的一部分,驱动程序可以自行定义给定组件的性能状态,也可以遵循平台扩展插件 (PEP) 来定义它们。

    设备驱动程序或 PEP 必须了解性能状态,包括每个组件的性能状态集数、性能状态的类型 (离散或基于范围的) ,以及实际性能状态的值和计数的详细信息。 如果 PEP 不支持性能状态,驱动程序仍可能向 PoFx 注册性能状态支持,并通知 OS 有关 Windows 性能分析器 (WPA) 中日志记录和分析的性能状态更改。

    在任一情况下, 成功完成 PoFxRegisterComponentPerfStates 后,驱动程序具有包含已注册性能状态集 的PO_FX_COMPONENT_PERF_INFO 结构。

  3. 当驱动程序决定组件应更改性能状态时,它会调用 PoFxIssueComponentPerfStateChangePoFxIssueComponentPerfStateChangeMultiple。 当性能状态更改完成时,PoFx 会调用驱动程序提供的 ComponentPerfStateCallback 例程。

  4. 无论 PEP 是成功还是拒绝性能状态更改, ComponentPerfStateCallback 例程都会通知驱动程序。 如果 PEP 成功更改,驱动程序将执行从其角度更改性能状态所需的任何工作。 如果 PEP 拒绝更改,驱动程序可以选择不执行任何操作,或者以相同或备用的性能状态再次重试请求。

设备电源管理参考