科学软件应优化多少?


13

对于需要大量计算资源的应用程序,高性能是在合理的时间内提供科学结果或实现“突破”的关键因素。

软件开发人员应该花多少时间和精力来优化应用程序?使用的关键标准是什么?


科学家编写的程序通常运行长时间(例如,模拟)。程序员时间和计算机运行时间可能是可比的。这与当今的“常规”程序员工作大不相同。像在早期的计算中一样,通常值得花一些精力(和程序员的时间)来使仿真更快,更快完成,并更快地完成工作。
Szabolcs'2

Answers:


15

在大多数情况下,算法的改进比优化的改进有更大的不同。与低级优化相比,算法也更具可移植性。我的建议是遵循有关内存布局的一般最佳实践,以实现缓存重用,避免过多的副本或通信,以理智的方式对待文件系统,并使浮点内核具有足够的粒度来进行矢量化。有时,这足以达到可接受的“峰值”分数(对于此操作)。

始终为您认为重要的操作(或通过分析发现重要的操作)绘制性能模型。然后,您可以使用性能模型来估计高度调整的实现可以实现的目标。如果您认为提高速度是值得的(相对于您可能要做的其他事情),请进行优化。

也许最困难的挑战是设计高级的,重要的(在某种意义上说,很多代码将取决于这些选择)接口和数据结构,以便您以后可以进行优化而无需更改API。与特定的优化和一般准则相比,除经验外,我不知道该如何教授。使用性能敏感的开源软件会有所帮助。与任何API决定一样,了解问题空间也很重要。


1
就在最近,我将分析的一个限制步骤的运行时间提高了10,000(对于我们最大的事件),只是用一个O(n log n)替换了时间和空间上为O(n ^ 2)的算法。 ) 同时。请注意,这意味着另一种依赖关系,并增加了一些复杂性,但有时还是值得的……
dmckee ---前主持人小猫

1
提速因子(相对于某物)与您所比较的相比没有什么价值。如果将您与基于不适当算法的不良实现进行比较,然后进行更改,那么期望获得较大的相对收益显然不是不合理的。
艾伦·恩格西格·卡鲁普

1
@Allan:单个更改要花费10,000,然后显然这是选择不当的实现。先前的代码受不必要的空间和时间复杂度的影响最大:缓存性能非常糟糕。但这就是重点吗?
dmckee ---前主持人小猫,

8

您将如何定义“优化”?从更好的算法或计算模型的开发到使用手动调整的汇编器,范围广泛。

在我看来和经验不足的地方是中间的某个地方,例如选择最适合基础计算机体系结构的算法。该算法不一定必须是新颖的,并且您对底层体系结构的理解也不必非常具体,例如

  • 如果您知道自己的体系结构支持SIMD,请重新构造计算结构,以便可以根据短向量来编写操作,
  • 如果您知道自己的体系结构是一台多核计算机,请尝试将计算任务分解为互不干扰的子任务并并行运行它们(请考虑一下子任务的DAG) ,
  • 如果您的基础架构具有GPU,则可以考虑将方法重新构造为一组线程,这些线程以步进方式逐步遍历数据,
  • 等等...

无需太多底层知识即可访问所有上述功能,例如SIMD,并行性和GPU,但实际上仅在可以轻松利用它们的算法中提供了优势。


4

我同意到目前为止已经提出的所有答案...我只想解决代码优化的另一个被忽略的方面:质量期望。

当用户试图解决越来越大的问题并且代码不足以满足用户的需求/期望时,通常会出现代码优化的问题。一个人应该在代码优化上投入的时间取决于满足这一期望的需求。如果迫切需要竞争优势(例如,先完成并发表关于热门话题的研究),那当然值得投入大量时间。

当然,应该花费多少时间取决于所需的时间以及所需的代码的可移植性。通常,这两个需求相互冲突,因此在开始优化之前,您必须确定哪个更重要。您想要的可移植性越强,就越需要依靠对代码(算法/数据结构)的高级设计更改。您希望代码执行得更快,必须使用特定于特定计算机的低级优化(例如,代码/编译器/运行时优化)对其进行调整。


4

您必须对花费如此多的工时(花费通常是神话般的:-)进行(成本)分析,以提高执行速度。您必须弄清楚该软件将被使用多少次,以及有多少人可以使用,才能估算出收益。

与往常一样,经验法则是著名的80/20法则。在某个时刻,它并不会花费更多的时间来获得更少的百分比(或更少)的运行时间。但是您必须进行分析。

我衷心同意以上海报:确保您的API经过深思熟虑,因此不需要太多更改,并确保代码可移植且可维护(请考虑重新分析您编写的算法,并精打细算)十年前进行了优化)。并确保您使用良好的编程习惯和标准库。可能已经有人为您的应用程序考虑了最有效的算法,这是合理的。

引用Donald Knuth的话:“过早的优化是万恶之源”。因此,分析您的代码,但不要太早。


您是指帕累托原则(80/20)规则吗?如果是这样,您是否意味着我们应该将优化工作的重点放在产生80%的速度下降的代码的20%上?还是您的意思是说,如果仅能预期20%的加速,那不值得优化吗?
保罗

不,我只是将其用作一种原则,并不完全是80/20。在某个时刻,您将花费大量的精力仅获得几个百分点,以至于不再值得付出任何努力。
GertVdE 2012年

3

一些其他建议:

  1. 在对工作程序进行任何优化之前,请确保您具有一组有助于维护代码完整性的测试用例。更快获得错误结果没有意义。
  2. 如果您的优化使代码的可读性降低,则保留原始版本(至少以注释的形式),但最好将其保留为可在编译时和运行时选择的替代版本。随着问题和机器的发展,您的优化需求可能会发生变化,并且从现在起五年后,原始代码可能是您进行优化的一个更好的起点。
  3. 如果您发现优化后的版本影响最小,但使代码的可读性,通用性或稳定性下降,请返回原始版本。您的损失大于获得的收益。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.