【问题标题】:How to use the cachegrind output to optimize the application如何使用 cachegrind 输出来优化应用程序
【发布时间】:2010-12-15 23:46:33
【问题描述】:

我需要提高系统的吞吐量。

通常的优化周期已经完成,我们已经实现了 1.5 倍的吞吐量。

我现在开始怀疑是否可以利用 cachegrind 输出来提高系统的吞吐量。

有人可以告诉我如何开始吗?

我的理解是,我们需要确保最常用的数据应该保持足够小,以便它保留在 L1 缓存中,而下一组数据应该适合 L2。

这是我选择的正确方向吗?

【问题讨论】:

    标签: daemon valgrind throughput


    【解决方案1】:

    确实,cachegrind 输出本身并没有提供太多关于如何优化代码的信息。人们需要知道如何解释它以及您所说的关于适合 L1 和 L2 的数据确实是正确的方向。

    要全面了解内存访问模式如何影响性能,我建议阅读 GNU libc 维护者 Ulrich Drepper 撰写的优秀论文 "What Every Programmer Should Know About Memory"

    【讨论】:

    • 感谢 Kaustaurya,这确实是一篇很棒的文章。我记得之前看过这篇文章,但这次我能够更好地理解其中的错综复杂。
    【解决方案2】:

    如果您在解析 cachegrind 输出时遇到问题,请查看 KCacheGrind(它应该在您选择的发行版中可用)。我使用它,发现它很有帮助。

    【讨论】:

      【解决方案3】:

      根据the Cachegrind documentation,cachegrind 提供给您的详细信息是代码给定部分的缓存未命中数。您需要了解缓存如何在您的目标架构上工作,以便您知道如何修复代码。实际上,这意味着使数据更小或更改某些数据的访问模式,以使缓存的数据仍在缓存中。但是,您需要先了解程序的数据和数据访问权限,然后才能对信息采取行动。正如手册中所说,

      简而言之,Cachegrind 可以告诉您代码中的一些瓶颈在哪里,但它不能告诉您如何解决它们。你必须自己解决这个问题。但至少你有信息!

      【讨论】:

        【解决方案4】:

        1.5 倍是一个不错的加速。这意味着你发现了一些你可以摆脱的东西,花费了 33% 的时间。我敢打赌,你可以做更多的事情,甚至在你处理数据内存缓存等低级问题之前。 This is an example of how. 基本上,您可能会遇到以前并不大的其他性能问题(以及加速的机会),比如 25% 的人说。嗯,随着 1.5 倍的加速,这 25% 现在是 37.5%,所以它比以前“更有价值”了。通常,此类问题的形式是某些堆栈中的函数调用请求工作,一旦您知道它的成本是多少,您可能会认为这不是完全必要的。由于 kcachegrind 并没有真正确定这些,你可能没有意识到这是一个问题。

        【讨论】:

        • 我基本同意。但是,我不会将缓存视为低级问题。您可能针对的任何平台都将具有缓存(甚至是现代 CUDA 卡)。缓存优化也可能产生很大的改进,并且可以在不查看编译器的程序集输出的情况下完成。
        • @JørgenFogh:对。处理器开发人员已在其领域内尽一切可能优化处理时间。我们软件开发人员并不总是通过确保我们的代码“精简和平均”来回报。我经常看到。
        • 这绝对是真的。我的观点是,好的处理器无法弥补低效的算法。这包括缓存性能较差的算法。缓存效率不能事后添加。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-24
        • 2015-07-05
        • 2015-08-28
        相关资源
        最近更新 更多