Memory 从数百万次计算中找出最大结果的最有效方法是什么?

Memory 从数百万次计算中找出最大结果的最有效方法是什么?,memory,optimization,language-agnostic,cpu-usage,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(

基本上,我正在做数百万个非常简单的计算,并试图存储最终打印的最高结果。我使用的是一个C#控制台应用程序,但它非常简单,与语言无关(这在另一种语言中会表现得更好吗?)

我所拥有的:

double output = 0;
//do the calculations
//after each:
if(calculationResult > output) output = calculationResult;
//done with calculations
Console.WriteLine(output);
这是可行的,但需要很长时间才能完成。我曾想过将答案存储在一个列表中,并在计算后对其进行排序,但由于9GB左右的内存不足,结果崩溃了

比较实时和仅存储一个需要的时间太长,但存储全部和稍后比较需要太多内存。有没有办法优化这个


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

几乎可以肯定,如果(calculationResult>output)output=calculationResult,那么缓慢的是计算步骤,而不是
部分


我不知道你的具体问题是什么,但要想找到数百万次计算中最大的一次,通常最有效的方法是仔细思考你的问题,使用更有效的算法和/或数学,这样你就不必进行数百万次计算。

正如马修所说,你需要提高计算过程的效率。除了找到更好的算法外,以下是一些建议:

  • 计算是否相互依赖?您可以使用多线程并将它们分布在多个核心上吗
  • 你能把它们矢量化,意思是使用SSE、AVX、AVX2等吗
  • 使用一个好的优化编译器,比如英特尔的。它是世界上最好的优化编译器之一。在许多情况下,它会自动为您并行化
  • 重新构造代码以利用缓存层次结构并最小化未命中
  • 如果你能同时做1和2,你可以获得惊人的速度。例如,如果您有一台具有超线程和AVX256的四核计算机,那么您有8个并行运行的虚拟核,每个虚拟核执行AVX256(4个双精度值),允许您并行执行32个计算。如果您使用的是一台服务器级机器,具有2个插槽和32个内核,每个都运行AVX512,那么您可以想象在理想情况下的加速效果
  • 找到一个算法,让你可以利用上述
  • 使用Fortran。我不是开玩笑。对于数值计算来说,这是无与伦比的。而且,考虑到它如何存储数据,它避免了许多优化问题

  • 看一看。他们希望您能够利用尽可能多的并行性,原因有很多,我在这里将不详细介绍。

    除了优化计算之外,您还可以可视化进度(使用进度条,使用局部最大值),并在达到绝对最大值时停止。谢谢。我的例子涉及到抛物线,所以我可以在通过顶点后跳到下一个集合,基本上将总数减半。