什么负责改变多核处理器中内核的负载和频率
What is responsible for changing core's load and frequency in multicore processor
在寻找对多核设计的描述后,我一直在寻找几个图表,但它们看起来都有点像这样:
我通过查看 i7z
命令输出知道不同的核心可以 运行 在不同的频率。
这表明,关于哪个内核将被赋予新进程以及更改内核本身的频率的决定是由操作系统或内核本身的控制块完成的。
我的问题是:是什么控制着每个核心的频率?将 READY
进程与放置在操作系统上的特定内核相关联的工作,还是由处理器内部的某些东西完成的。
核心频率由施加到核心 "oscillator" 的给定电压控制。
此电压可由操作系统更改,但如果在 CPU 中检测到高温,也可由 BIOS 本身更改。
调度processes/threads到核心纯粹是up to the OS。硬件不了解等待 运行 的任务。维护 OS 的 运行 可用进程列表与等待 I/O 完全是软件问题。
将线程从一个内核迁移到另一个内核是通过将 architectural state 存储到内存中的原始内核上的内核代码完成的,然后 OS 新内核上的代码恢复保存的状态并恢复用户-space执行。
传统上,频率和电压缩放决定是由 OS 做出的。以Linux为例:决策代码称为governor (and also this arch wiki link came up high on google). It looks at things like how often processes have used their entire time slice on the current core. If the governor decides the CPU should run at a different speed, it programs some control registers to implement the change. As I understand it, the hardware takes care of choosing the right voltage to support the requested frequency.
据我了解,每个内核上的 OS 运行ning 独立做出决定。在允许每个核心 运行 不同频率的硬件上,决策代码不需要相互协调。如果 运行 在一个内核上实现高频需要整个芯片范围内的高压,则硬件会负责。我认为 DVFS(动态电压和频率缩放)的现代实现相当高级,OS 只是告诉硬件它想要 N 个选择中的哪一个,板载电源微控制器负责编程的细节振荡器/时钟分频器和稳压器。
英特尔的 "Turbo" 功能,机会主义地将频率提高到最大可持续频率之上,在硬件中进行决策。任何时候 OS 请求最高的广告频率,CPU 在电源和冷却允许的情况下使用涡轮增压。
Intel 的 Skylake 更进了一步:OS 可以将 DVFS 的完全控制权交给硬件,可以选择使用约束。这让它可以从微秒到微秒做出反应,而不是在毫秒的时间尺度上做出反应。这实际上确实可以在突发工作负载中提供更好的性能,因为在有用时可以为 Turbo 提供更多的功率预算。一些基准测试足以观察到这一点,比如一些浏览器/javascript 那些 IIRC。
在 IDF2015、check out the slides and/or archived webcast. The old method is described in a lot of detail there, too, to illustrate the difference, so you should really check it out if you want more detail than my summary. (The list of other IDF talks is here, thanks to Agner Fog's blog link)
上对 Skylake 的新电源管理进行了完整的讨论
在寻找对多核设计的描述后,我一直在寻找几个图表,但它们看起来都有点像这样:
我通过查看 i7z
命令输出知道不同的核心可以 运行 在不同的频率。
这表明,关于哪个内核将被赋予新进程以及更改内核本身的频率的决定是由操作系统或内核本身的控制块完成的。
我的问题是:是什么控制着每个核心的频率?将 READY
进程与放置在操作系统上的特定内核相关联的工作,还是由处理器内部的某些东西完成的。
核心频率由施加到核心 "oscillator" 的给定电压控制。
此电压可由操作系统更改,但如果在 CPU 中检测到高温,也可由 BIOS 本身更改。
调度processes/threads到核心纯粹是up to the OS。硬件不了解等待 运行 的任务。维护 OS 的 运行 可用进程列表与等待 I/O 完全是软件问题。
将线程从一个内核迁移到另一个内核是通过将 architectural state 存储到内存中的原始内核上的内核代码完成的,然后 OS 新内核上的代码恢复保存的状态并恢复用户-space执行。
传统上,频率和电压缩放决定是由 OS 做出的。以Linux为例:决策代码称为governor (and also this arch wiki link came up high on google). It looks at things like how often processes have used their entire time slice on the current core. If the governor decides the CPU should run at a different speed, it programs some control registers to implement the change. As I understand it, the hardware takes care of choosing the right voltage to support the requested frequency.
据我了解,每个内核上的 OS 运行ning 独立做出决定。在允许每个核心 运行 不同频率的硬件上,决策代码不需要相互协调。如果 运行 在一个内核上实现高频需要整个芯片范围内的高压,则硬件会负责。我认为 DVFS(动态电压和频率缩放)的现代实现相当高级,OS 只是告诉硬件它想要 N 个选择中的哪一个,板载电源微控制器负责编程的细节振荡器/时钟分频器和稳压器。
英特尔的 "Turbo" 功能,机会主义地将频率提高到最大可持续频率之上,在硬件中进行决策。任何时候 OS 请求最高的广告频率,CPU 在电源和冷却允许的情况下使用涡轮增压。
Intel 的 Skylake 更进了一步:OS 可以将 DVFS 的完全控制权交给硬件,可以选择使用约束。这让它可以从微秒到微秒做出反应,而不是在毫秒的时间尺度上做出反应。这实际上确实可以在突发工作负载中提供更好的性能,因为在有用时可以为 Turbo 提供更多的功率预算。一些基准测试足以观察到这一点,比如一些浏览器/javascript 那些 IIRC。
在 IDF2015、check out the slides and/or archived webcast. The old method is described in a lot of detail there, too, to illustrate the difference, so you should really check it out if you want more detail than my summary. (The list of other IDF talks is here, thanks to Agner Fog's blog link)
上对 Skylake 的新电源管理进行了完整的讨论