【问题标题】:What is the most efficient way to find the greatest result of millions of calculations?在数百万次计算中找到最大结果的最有效方法是什么?
【发布时间】:2015-12-03 02:43:58
【问题描述】:

基本上,我正在进行数百万次非常简单的计算,并尝试存储要在最后打印的最高结果。我正在使用 C# 控制台应用程序,但这很简单,以至于与语言无关(这在另一种语言中会表现得更好吗?)

我有什么:

double output = 0;
//do the calculations
//after each:
if(calculationResult > output) output = calculationResult;
//done with calculations
Console.WriteLine(output);

这可行,但需要很长时间才能完成。我曾想过将答案存储在一个列表中并在计算后对其进行排序,但它崩溃为 OutOfMemory 大约 9GB。

实时比较和只存储一个需要太长时间,但是存储所有并稍后比较会占用太多内存。有什么办法可以优化吗?

编辑:我的解决方案是首先在到达由答案形成的抛物线的顶点后继续将计算次数减半。然后我意识到最好的解决方案是将所有内容重构为递归,从低精度和宽范围开始,然后在提高精度的同时缩小范围。使用英特尔 IPP 迁移到 C++ 后,完成时间仅减少了约 8%,而操作减少了约 99%。我现在正在研究递归,并将报告。

【问题讨论】:

  • 除了优化计算之外,您还可以可视化进度(带有进度条,具有局部最大值)并在达到/如果达到绝对最大值时停止。

标签: memory optimization language-agnostic cpu-usage


【解决方案1】:

正如 Matthew 所说,您需要提高流程的效率。除了寻找更好的算法之外,还有一些建议:

  1. 计算是否相互依赖?您可以多线程并将它们分布在多个内核上吗?
  2. 您能否对它们进行矢量化处理,即使用 SSE、AVX、AVX2 等?
  3. 使用良好的优化编译器,例如 Intel 的。它是最好的优化编译器之一。在许多情况下,它会自动为您并行化。
  4. 重组代码以利用缓存层次结构并最大限度地减少未命中。
  5. 如果您可以同时执行 1 和 2,您可以获得显着的加速。例如,如果您有一台具有超线程和 AVX256 的四核机器,则您有 8 个并行运行的虚拟内核,每个执行 AVX256(4 个双精度值),允许您并行执行 32 次计算。如果您使用具有 2 个插槽和 32 个内核的服务器级机器,每个运行 AVX512,您可以想象在理想条件下的加速。
  6. 找到一种允许您利用上述内容的算法。
  7. 使用 Fortran。我不是在开玩笑。对于数值计算,它无法被击败。考虑到它存储数据的方式,它避免了很多优化问题。

看看Intel's site。他们希望您能够尽可能多地利用并行性,原因有很多,我不会在这里讨论。

【讨论】:

    【解决方案2】:

    几乎可以肯定,缓慢的是计算步骤,而不是if(calculationResult > output) output = calculationResult; 部分。

    我不知道您的具体问题是什么,但通常最有效的方法是在数百万次计算中找到最大的计算量,并仔细考虑您的问题并使用更有效的算法和/或数学这样您就不会'不必进行数百万次计算

    【讨论】:

    • 谢谢。我的案例涉及抛物线,所以我可以在通过顶点后跳到下一组,基本上将总数减半。
    猜你喜欢
    • 2015-04-02
    • 2013-03-17
    • 2016-02-08
    • 2013-01-23
    • 2013-12-03
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2011-01-26
    相关资源
    最近更新 更多