【问题标题】:What should I know to optimize programs? [closed]我应该知道什么来优化程序? [关闭]
【发布时间】:2013-05-29 02:04:26
【问题描述】:

我需要运行一个计算量很大的程序。因此,性能是我首先关心的问题。似乎有很多关于 CPU 的细节应该考虑在内。如硬件预取、缓存、分支预测、流水线等。如何获得有关此主题的全面信息?

谢谢。

【问题讨论】:

  • 这是一个非常广泛的问题。首先将您的程序编写为正确,然后对其进行profile 以衡量其性能并进行相应的优化。
  • 如今人们获取有关任何主题的详尽信息的方式相同......在网络上搜索有关该主题的文章和书籍。
  • @AdamRosenfield 是的,我的程序运行良好。但我不知道我的程序是否会导致缓存丢失或分支预测失败之类的事情。
  • 首先你需要通过this method把你的大象变成一匹赛马。只有到那时,才担心硬件级别的东西。

标签: c optimization assembly hardware cpu


【解决方案1】:

要学习的第一件事,也是最重要的一点是:不要试图猜测为什么您的程序可能会很慢。让它工作,然后测试它以找出答案。当然,有些事情可能是个问题,但是真实数据集上的真实代码常常会让你大吃一惊。你真的无法提前知道瓶颈在哪里,所以学习使用像 Valgrind 这样的分析工具来测量你的实际代码并从那里开始。

【讨论】:

  • +1 在您进行测试之前,您甚至都不知道该程序是否会慢得无法接受。
【解决方案2】:

我理解您在创建一个可能需要解决典型计算机体系结构情况的应用程序时的担忧。在此之前,我建议您阅读一本有关计算机体系结构的书,以便您全面了解之前接触应用程序的内容和方法。

让我同样推荐你一本书>>http://www.amazon.com/Computer-Organization-Architecture-Stallings-Communications/dp/013293633X

希望我能帮上忙。

【讨论】:

    【解决方案3】:

    您应该了解计算机编程并且您应该非常了解它。编写干净的代码,对其进行分析,找到瓶颈并更新代码。很可能编译器已经为您提供了大量优化选项,请阅读其文档。而且我相信现在的编译器比大多数程序员做得更好。

    当你得到所有这些并且你仍然缺少性能时,你可以阅读以下内容:

    【讨论】:

      【解决方案4】:

      一个好的优化编译器已经知道“硬件预取,缓存,分支预测,管道”等所有细节。你需要告诉编译器你的目标是什么特定的CPU。对于 gcc,使用 -march-mtune 选项作为起点。

      尝试使用不同的编译器,例如 clang 和英特尔 C 编译器。

      使用各种输入数据分析您的程序,并确定瓶颈在哪里,然后研究如何为瓶颈编写更快的代码。与针对特定瓶颈调整汇编代码相比,使用更智能的算法几乎总能获得更多收益。

      【讨论】:

        猜你喜欢
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 2013-12-30
        • 2023-03-21
        • 2022-09-21
        • 1970-01-01
        • 2014-04-09
        • 2012-03-07
        相关资源
        最近更新 更多