找到数百万计算的最佳结果的最有效方法是什么?

时间:2015-12-03 02:43:59

标签: memory optimization language-agnostic cpu-usage

基本上,我正在进行数百万次非常简单的计算,并试图将最高结果存储在最后。我正在使用一个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%。我现在正在进行递归,并将报告回来。

2 个答案:

答案 0 :(得分:2)

正如马修所说,你需要让这个过程更有效率。除了找到更好的算法,这里有一些建议:

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

答案 1 :(得分:0)

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

我不知道您的特定问题是什么,但通常最有效的方法来查找数百万计算中最重要的方法是仔细考虑您的问题并使用更有效的算法和/或数学让您不要不得不进行数百万次计算