【问题标题】:How long would it take to run an algorithm with 10-100 quadrillion steps on a 1 ghz processor?在 1 GHz 处理器上运行具有 10-100 万亿步的算法需要多长时间?
【发布时间】:2016-05-06 12:30:14
【问题描述】:

这是我关于 SO 的第一个问题,如果不合适/离题,请告诉我。我把上面的问题说得很笼统,但我遇到的具体问题如下:

我想编写一段 Java 代码,该代码生成一个列表,其中列出了所有可能的州组合,这些组合会导致选举团平局。最短的可能列表将包含 12 个州,最长的可能列表将包含 38 个州。我做了一些(非常)粗略的计算,所有可能的组合都达到了(也许)10 万亿。我仍处于算法的规划阶段,但假设 10 万亿是所需步数的绝对下限,我想实际数字会高得多。

我对编程很陌生,想知道是否值得编写这段代码 - 一项粗略的计算表明该算法需要大约 30 年才能完成(!)。但是,我基于维基百科建议的 MIP(每秒百万条指令)值进行了此计算,我不知道这到底有多准确(或者,实际上,对于这些目的而言,什么实际上算作“指令”)。

非常感谢您阅读和/或回答:)

【问题讨论】:

  • 第一个问题:您打算对列表做什么? (显然不适合内存或磁盘...)
  • 您在 Java 中的一条语句实际上最终会成为 CPU 的几条指令(几个周期)。你是怎么计算的?你怎么知道你需要多少个 cpu 周期?
  • @JonSkeet 这是一个公平的问题,我已经想到了 - 答案是我真的不想要 10 万亿长的列表,我只想要一个(短得多)实际导致平局的组合列表。
  • @KorayTugay 简短的回答是:我不知道我需要多少 CPU 周期,只知道它至少需要 10 万亿,实际上更多。至于我是如何计算的,我计算出 12、38 和 25 的列表有多少种可能的组合,然后取平均值并将其乘以 26。我知道,草率,但我只是想要一个大概的数字(假设非常大的球场)

标签: java algorithm performance combinations


【解决方案1】:

1 GHz 处理器的时钟每秒跳动 10 亿次。时钟滴答用于允许信号流过系统。因此,理论上可以执行的最大操作数(任何类型)是每秒 10 亿次操作。要执行 10 万亿次操作,理论上的最短时间是 10 万亿次除以 10 亿,即 1000 万(秒)。如果我的计算是正确的,那大约是 116 天。在实践中,您不会获得那么高的性能,但是使用现代流水线处理器您实际上应该做得很好,对于优化良好的汇编程序来说至少 50%。因此,对于单个现代 1 GHz 处理器,我认为 200 天对于整数运算(就像您在组合数学中所期望的那样)是一个非常合理的猜测。

现在,您的“步骤”可能包含大量机器指令。对于任何足够复杂的“步骤”来说,这似乎都是可能的。如果一个“步骤”是 100 条机器指令(一个相当强大的“步骤”),那么我们实际上所说的更像是 20,000 天或 54 年。

现在,我们能做什么?好吧,生成组合非常适合并行编程。例如,如果您能够在超级计算中心获得一些时间并在 1000 个内核上运行这项工作,每个内核都以 3 GHz 运行,那么该运行将需要大约 7 天才能完成 - 考虑到非并行工作可能需要 10 天。

或者,如果您可以制定一个巧妙的算法来避免分支,您可以购买一些 NVIDIA GTX 980 并在家里运行它。每个显卡大约有 2,000 个内核,每个内核的运行速度约为 1 GHz,因此这些坏男孩中的一些将极大地加快您的任务(同样,如果您可以以在显卡上高效的方式编写程序 - 那就是最困难的部分)。

判决?可行,但成本高和/或困难 - 如果您不习惯编写大规模并行程序,这将是您希望做的任何可行的事情所必需的,尤其困难。

【讨论】:

  • 谢谢!这几乎涵盖了我想知道的一切。在接下来的 6 个月/54 年里,我可能不会运行这个算法,所以我想我只是想知道 :)
【解决方案2】:

从基本逻辑计算,理论上1GHz可以做10亿次计算/秒。

10 万亿次计算的时间意味着 10 万亿/10 亿次

算一算,你会发现大约需要115天才能完成

10,000,000,000,000,000 / 1,000,000,000 = 10,000,000 seconds
10,000,000 seconds = 166,667 minutes
166,667 minutes = 2778 hours
2778 hours = 115 days

但这都是理论上的

【讨论】:

    猜你喜欢
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多