关于缓存:DeepRoute-Lab-缓存对多线程程序性能的影响
当咱们的多线程程序遇到性能问题时,通常咱们会下意识地感觉这是因为上下文切换、cpu 迁徙等因素导致的。那么,如何更进一步地剖析到底是哪一部分语句造成了什么样的影响呢?这篇分享将从计算机体系结构的角度,联合十分典型的代码案例,为你解惑。 在进入正题之前,如果对缓存还不理解的读者,能够先看看这篇分享。DeepRoute Lab | 【C++性能】CPU Cache Serial 1 01引子1.1 第一个代码片段(点击查看大图) 1.2 第二个代码片段(点击查看大图) 1.3 转置代码片段一外面,GoodWorker的效率(计算的耗时)是 BadWorker 的 10 倍左右(取决于具体硬件条件和其余相干因素)。在不晓得其余背景常识的前提下,咱们怎么来定位这个问题呢?加耗时的打印?- 不好意思,面对这种曾经只剩大量基本操作的代码,没法做到更细粒度的耗时打印了。看火焰图? (点击查看大图) 能够看到,除了 GoodWorker 在整个 workload 上的占比(83%)比 BadWorker (96%) 略低以外(也不能提供其余进一步的指导意义了), 两个函数在火焰图上都堪称是“层峦叠嶂”,火焰图在这种状况下也失去了指导意义。难道就没有任何方法了吗?开什么玩笑,如果没有方法,这篇文章也就写不上来了!那么答案是什么呢! 02Perf Events 初探2.1 代码片段一的性能数据在具体介绍 perf events 之前,让咱们直观地通过数据来领会一下它在剖析这类问题上的弱小之处。上面所有相似的后果均采纳 perf events 生成。 (点击查看大图) 以上别离是 BadWorker 和 GoodWorker 应用 Perf Events 诊断的后果,能够看到曾经有大量的差别微小的数值和比例了。咱们通过一个表格比照一下几个次要的指标:咱们能够看到,GoodWorker 相较于 BadWorker,外表上除了 backend stall rate 处于劣势以外,其余均全面占优,其中 frontend stall rate 和 LLC load miss 的性能达到了百倍的差距(尽管外表上 LLC miss rate 只有不到两倍,然而数量上大于百倍)。BadWorker 另一个显著的数据 pattern 如下(后文会解释这些数值的意义,不要焦急!) Frontend stall rate 【显著高于】backend stall rateL1-icache miss rate【在数量级上靠近】L1-dcache miss rateLLC miss rate 的【数值也不低】Branch miss rate 【显著升高】(这个与具体代码中是否存在分支无关)并且咱们晓得,在 GoodWorker 的比照下,BadWorker 肯定是一种有问题的实现形式。那么至此,咱们至多对一种问题代码的 perf events 的数据模式有了一个初步的意识。 ...