我需要提高系统的吞吐量。
通常的优化周期已经完成,我们已经实现了1.5倍的更高吞吐量。
我现在开始怀疑是否可以利用cachegrind输出来提高系统的吞吐量。
有人可以指点我如何开始吗?
我的理解是我们需要确保最常用的数据应保持足够小,以便它保留在L1缓存中,下一组数据应该适合L2。
这是我正在采取的正确方向吗?
答案 0 :(得分:6)
事实上,cachegrind输出本身并没有提供太多关于如何优化代码的信息。人们需要知道如何解释它以及你所说的关于数据拟合到L1和L2的内容确实是正确的方向。
为了完全理解内存访问模式如何影响性能,我建议您阅读GNU libc维护者Ulrich Drepper的优秀论文"What Every Programmer Should Know About Memory"。
答案 1 :(得分:3)
如果您在解析cachegrind输出时遇到问题,请查看KCacheGrind(它应该在您选择的发行版中提供)。我使用它并发现它非常有帮助。
答案 2 :(得分:2)
根据the Cachegrind documentation,cachegrind给你的详细信息是代码中给定部分的缓存未命中数。您需要了解缓存如何在您正在定位的体系结构上工作,以便您知道如何修复代码。实际上,这意味着缩小数据或更改某些数据的访问模式,以便缓存的数据仍在缓存中。但是,您需要先了解程序的数据和数据访问权限,然后才能对信息进行操作。如手册中所述,
简而言之,Cachegrind可以告诉您代码中的某些瓶颈在哪里,但它无法告诉您如何修复它们。你必须自己解决这个问题。但至少你有这些信息!
答案 3 :(得分:2)
1.5x是一个不错的加速。这意味着你找到的东西占你可以摆脱的33%的时间。我打赌你可以做更多,甚至在你遇到像数据内存缓存这样的低级问题之前。 This is an example of how.基本上,你可能会遇到额外的性能问题(以及加速的机会),这些问题之前并不大,比如25%的人说。好吧,1.5倍的加速,25%现在是37.5%,所以它比它更“值得”。通常这样的问题是一些中间函数调用的形式,它要求工作,一旦你知道它的成本,你可能认为不是完全必要的。由于kcachegrind并没有真正指出这些,你可能没有意识到这是一个问题。