用 CPI 火焰图分析 Linux 性能问题

1. 什么是 CPI ?

本小节讲述为什么使用 CPI 分析程序性能的意义。如果已经非常了解 CPI 对分析程序性能的意义,可以跳过本小节的阅读。

1.1 程序怎么样才能跑得快 ?

理解什么是 CPI,首先让我们思考一个问题:在一个给定的处理器上,如何才能让程序跑得更快呢?

假设程序跑得快慢的标准是程序的执行时间,那么程序执行的快慢,就可以用如下公式来表示:

   程序执行时间 = 程序总指令数 x 每 CPU 时钟周期时间 x 每指令执行所需平均时钟周期数

因此,要想程序跑得快,即减少程序执行时间,我们就需要在以下三个方面下功夫:

  1. 减少程序总指令数

    要减少程序执行的总指令数,可能有以下手段:

    • 算法优化;好的算法设计,可能带来更少的指令执行数
    • 更高效的编译器或者解释器;新的编译器或者解释器,可能对同样的源代码,生成更少的机器码。
    • 用更底层的语言优化;这是为何 Linux 内核代码使用 C 语言,并且还喜欢内联汇编。
    • 更新的处理器指令;新的处理器指令,对处理某类特殊目的运算更有帮助,而新版本编译器最重要的工作就是,在新的处理器上,用最新的高效指令;例如,x86 SSE,AVX 指令。
  2. 减少每 CPU 时钟周期时间

    这一点很容易理解,缩短 CPU 时钟周期的时间,实际上就是要提高 CPU 的主频。这正是 Intel 过去占无不胜的法宝之一。今天,由于主频的提高已经到了制造工艺的极限,CPU 时钟周期的时间很难再继续降低了。

  3. 减少每指令执行所需平均时钟周期数

    如何减少每指令执行所需平均 CPU 时钟周期数呢?让我们先从 CPU 设计角度看一下:

    • 标量处理器 (Scalar Processor) ;一个 CPU 时钟周期只能执行一条指令;
    • 超标量处理器 (Superscalar Processor);一个 CPU 时钟周期可以执行多条指令;通常这个是靠在处理器里实现多级流水线 (Pipeline) 来实现的。

    因此不难看出,如果使用支持超标量处理器的 CPU,利用 CPU 流水线提高指令并行度,那么就可以达到我们的目的了。流水线的并行度越高,执行效率越高,那么每指令执行所需平均时钟周期数就会越低。

猜你喜欢

转载自my.oschina.net/u/3611008/blog/2962919
CPI