如果CPU总是在执行指令,我们如何衡量其工作?

时间:2015-03-05 16:24:16

标签: cpu cpu-usage cpu-architecture

让我们假设我们有一个虚拟的单核CPU,带有程序计数器和基本指令集,如加载,存储,比较,分支,添加,Mul和一些ROM和RAM。在接通时,它从ROM执行程序。

说CPU所做的工作是基于它执行的指令类型是否公平。例如,MUL操作可能涉及比分支更多的晶体管。

然而,从外部角度来看,如果时钟速度保持不变,那么可以说CPU可以不断地以100%运行。

我们究竟如何建立衡量CPU工作的范例?是否存在某种标准度量标准,可能基于执行的指令类型,CPU的功耗,完成的时钟周期数,甚至是否访问RAM或ROM。

相关的第二个问题是该计划对于停止"意味着什么。它通常只是在无限循环中分支,还是PC暂停,CPU等待中断?

3 个答案:

答案 0 :(得分:3)

首先,CPU总是执行某些代码,这些日子只是近似值。计算机系统具有所谓的睡眠状态,当没有太多工作要做时,这种状态允许节能。现代CPU也可以节省速度,以提高电池寿命。

除此之外,执行“一些工作”和“有用工作”的CPU之间存在差异。 CPU本身无法分辨,但操作系统通常可以。除了某些嵌入式软件之外,CPU永远不会运行单个作业,而是运行具有不同进程的操作系统。如果没有有用的进程可以运行,操作系统将调度“空闲任务”,这主要意味着让CPU休眠一段时间(见上文)或者在一个没有用处的循环中烧掉CPU周期。计算在空闲任务中花费的时间与在常规任务中花费的时间的比率给出了CPU的业务因素。

因此,在DOS的旧时代,当计算机运行(几乎)只有一个任务时,它确实总是在做某事。许多应用程序使用所谓的忙等待,如果他们推迟执行一段时间,没有任何用处。但是今天几乎总会有一个智能操作系统可以运行空闲进程,而不是让CPU进入睡眠状态,降低速度等。

答案 1 :(得分:3)

哦,小伙子,这是个顽固分子。这是一个非常实际的问题,因为它是性能和效率的衡量标准,也是一个非常主观的问题,因为它判断哪些指令或多或少“有用”以实现应用程序的目的。应用程序的目的可能是任何事情,例如找到复杂矩阵方程的解决方案或在显示器上渲染图像。

此外,现代处理器在电源空闲状态下执行时钟门控等操作。振荡器仍在产生周期,但由于某些电路由于没有到达它们的周期而被闲置,因此没有指令执行。这些循环没有做任何有用的事情,需要忽略。

类似地,现代处理器可以同时执行多个指令,不按顺序执行它们,并预测和执行在程序(即IP或指令指针)实际到达之前将执行的指令。您不希望包含执行从未实际完成的指令,例如因为处理器猜错并且必须刷新这些指令,例如由于分支机构的错误预测。因此,更好的指标是计算实际完成的指令。完成的说明称为“退休”。

所以我们应该只计算那些完成(即退休)的指令,以及实际用于执行指令的周期(即无挂钩)。)

“工作”最实用的通用指标可能是CPI或每指令周期:CPI = CPU_CLK_UNHALTED.CORE / INST_RETIRED.ANY。 CPU_CLK_UNHALTED.CORE是用于执行实际指令的周期(与在空闲状态下“浪费”的指令相比)。 INST_RETIRED是那些完成的指令(与那些不是由于分支错误预测之类的指令相比)。

尝试获取更具体的度量标准,例如有助于解决矩阵倍数的指令,以及排除不直接有助于计算解决方案的指令(如控制指令),这是非常主观且难以实现的。收集统计数据。 (有些可以,例如VECTOR_INTENSITY = VPU_ELEMENTS_ACTIVE / VPU_INSTRUCTIONS_EXECUTED,这是每秒执行的SIMD向量操作的数量,例如SSE或AVX。这些指令更可能直接有助于解决数学问题解决方案,因为这是他们的主要目的。)

现在我已经开始讨论您的问题了,请查看当地友好的英特尔开发人员资源software.intel.com上的一些优化资源。特别是,看看如何有效地使用VTune。虽然你可以获得免费或非常优惠的学生执照(我认为),但我并不是说你需要获得VTune。但是这些材料会告诉你很多关于提高你的程序性能(即优化)的信息,也就是说,如果你考虑它,可以增加你的程序完成的有用工作。

答案 2 :(得分:0)

稍微扩展Michał的回答:

为现代多任务操作系统编写的程序更像是事件处理程序的集合:它们有效地为I / O设置侦听器,然后将控制权交还给操作系统。每当有东西要处理时(例如用户操作,来自设备的数据),OS就会唤醒它们,并且一旦完成处理,它们就会通过调用OS来“进入睡眠状态”。大多数操作系统也会preempt,以防一个进程占用CPU太长时间并使其他进程挨饿。

然后,操作系统可以监视每个进程实际运行的时间(通过记住每次运行的开始和结束时间)并生成统计信息,如CPU时间和负载(就绪队列长度)。

回答你的第二个问题:

停止主要意味着不再调度进程,并且销毁所有相关资源(调度数据结构,文件句柄,内存空间......)。这通常需要进程调用特殊的OS调用(系统调用/中断),以便操作系统可以优雅地释放资源。

如果一个进程遇到无限循环并停止响应OS事件,那么它只能被强制停止(只是不再运行它)。