我可以并行化大整数添加吗?

时间:2012-02-04 04:44:11

标签: multicore

我需要在20亿次上添加两个无符号256兆位整数。由于携带显然非常重要,并且无法在不等待添加较低阶位的情况下确定,因此多核CPU功能是否有任何性能提升,例如将数字分成多个部分并稍后处理进位? / p>

3 个答案:

答案 0 :(得分:2)

你绝对可以把它分成很多部分。例如,取这两个数字:

  12345
+ 67890

现在我们将在第三个数字之后,在数百到数十列之间拆分它们。这给了我们

  123      45
+ 678    + 90

计算每个

的结果
  123      45
+ 678    + 90
-------------
  801     135

在左侧数字集上你需要知道你砍掉了多少位数,在这种情况下,两位数,所以在801的末尾添加两个零,给你80100.并添加135,你有80235

您可以使用更大的数字执行此操作,并根据需要进行多次拆分。使用此方法可防止任何携带发生。

当然,当你重新组合大数字时,你仍然会留下大量的内容。您可以计算出已经携带了多少位数,只需将少量数字添加到您的左手数字中。

例如,在上面的示例中,我们右边的数字最终从2列变为3列,结果为135.因此额外的列是要携带的数字,可以添加到您的801这允许你添加到小数字,然后只是像字符串

那样连接两个数字

45和90都占据了两列,其中添加了135列。我们生成了任何额外的列,在这种情况下,仅为1,并将其添加到我们的左手数字801。

801 + 1 = 802   
802 concatenated with 35 = 80235

如果你想要一些非常有效的东西,我相信你可以查看32位处理器如何添加64位或更大的数字。我确信他们为64位数字做了类似的事情,增加了两个32位部分,并从最低有效的32位转移到最重要的部分。

在并行化方面,将您的数字拆分为32位对以加在一起,然后确定CPU可以同时处理多少可用线程,并将您的对列表拆分那么多并给出那么多到每个线程。计算结果时,将它们放在已完成的部分中。

一旦你得到所有结果,将数字从最低有效数据带到最高有效数字的技巧将是棘手的,因为向数字添加一个单独的1值也会导致它翻过另一个数字。

答案 1 :(得分:0)

为什么不使用GMP library

答案 2 :(得分:0)

如果您将鼠标移到标签上,您会找到有关该主题感兴趣的人数的信息:

  • multicore - 118
  • 多线程 - 2.1k
  • C - 11.7k
  • C ++ - 17k
  • 表现1.3k
  • spinlock - 5
  • atomic - 18

您可以选择一个主题,然后通过添加其他/其他主题来缩小问题数量。

您的原始帖子与使用多核更有效的添加有关,因此多核将是一个可供选择的标记。由于多线程是使用多核选择的任何操作系统或应用程序的一部分。你现在有117个问题。您可能希望用户选择问题而不是更少的点数。查看单个问题的标签,避免使用C#,Java和.Net,因为这些主题更多的是代码生成效率而不是代码执行效率。

您可以搜索的其他概念包括亲和力,临界区,饱和度,内存锁定/屏障,线程安全,rdtsc。

你可能要记住的一件事是,编写真正快速代码的实用性与试错有很大关系,让你的脚湿透或任何你想称之为的东西。你在这里可以找到关于你可以尝试什么,你想要注意什么的提示。

关于GMP的原始答案,我建议您查看author's page。它包含有关诸如不同x86体系结构上的持续指令吞吐量,使用整数乘法除以常数整数以及赢得Simon Singh Code Book挑战等信息。还有关于GMP本身的绩效信息。