【问题标题】:Using GPU to speed up BigInteger calculations使用 GPU 加速 BigInteger 计算
【发布时间】:2017-07-05 01:16:19
【问题描述】:

我几乎完成了一个处理一些非常大整数的算法(大约 2 的 100,000,000 次幂)。这需要在具有足够内存的 16 核服务器上花费几个小时的高度并行代码,因为该算法不是内存密集型的。我在 .NET 4 中使用 BigInteger 类。

算法的细节并不重要,但对于上下文,以下是对这些整数执行的操作的详尽列表以及算法的一些显着特征:

  • 加法/减法。
  • 小数乘以大数。
  • 将大数除以非常小的数(例如 2)。
  • Base 2 日志。
  • Base 2 电源。
  • 两个或多个大数(最小值/最大值)的比较。
  • 不涉及任何质数。
  • 该算法经过专门设计,不会占用大量内存,因为内存访问对性能的影响超过了一些智能的动态计算。不过,如果要改进内存访问,算法可以合理地受益。

我已经尽可能地优化了代码,现在分析只显示了两个瓶颈:

  • 为如此大的数字计算以 2 为底的对数。
  • 检查这些数字中二进制数字的预定义模式。这是因为访问 BigInteger 底层数据的唯一方法是首先使用 ToByteArray 而不是就地操作。此外,对字节大小的块进行操作也无助于提高性能。

考虑到内存访问和日志操作,我开始考虑 GPU 以及是否可以有效地卸载一些工作。除了针对浮点运算进行了优化之外,我对 GPU 知之甚少。

我的问题是,使用 GPU .NET 之类的库,如何在 GPU 上处理如此大的数字?我可以以某种方式利用浮点优化来计算如此大的数字的 Log 吗?

寻找制定策略的起点。

【问题讨论】:

  • 您考虑过使用 CUDAfy.NET 吗? cudafy.codeplex.com(请注意,这是 NVIDIA 特有的,因此可能对您没有用处)

标签: c# .net performance gpu physics


【解决方案1】:

我正在寻找 C# 中的 GPU 工作,并正在考虑 Tidepowerd.com GPU.NET 和 CUDAfy.NET。当我上次检查时,Nvidia 特定和 CUDAfy 都不(还)支持单声道。但它们都允许在 GPU 上运行的 C# 中看起来相当正常的代码。

另外,您是否考虑过使用 3d 派对库?有几个非常好的 BigInteger 库,也是开源的。 GMP很好而且免费; http://gmplib.org/,至少有一个 C# 包装器(我没有经验)http://www.emilstefanov.net/Projects/GnuMpDotNet/

.NET 中的 BigInteger 类是不可变的,根据我的经验,这并不方便。如果您有 2 个整数(大约 100MB),则添加操作会产生第三个 100MB BigInt。例如,如果要修改两个原件之一,则可以更快地完成。

C = A + B means allocating 100MB for C (this is what BigInt does)
A = A + B means you no longer have the original A, but a much faster calculation

【讨论】:

  • 谢谢。在下载了包括您建议的三个库后,我似乎在任何地方都没有找到 Log 功能。这是故意的并且难以实施吗?
  • @RaheelKhan 你需要浮点日志还是最高设置位的位置?
  • 我需要这两个取决于场景。无论如何,使用 BigInteger 设置最高位是微不足道的。浮点数花费了我太多时间。
  • 有一个基于 gnu mp 的库,用于非常大的浮点数,我认为它具有 log() 函数。见mpfr.org
【解决方案2】:

如果有人觉得它有帮助,这里是 BigInteger 的 Log Base 2 实现,它比使用内置函数快得多。

private static BigInteger LogBase2(BigInteger num) {
    if (num <= Zero)
        return MinusOne; //does not support negative values.
    BigInteger i = Zero;
    while (!(num >>= 1).IsZero)
        i++;
    return i;
}

【讨论】:

  • 谢谢。很老的问题,但我还是想回去做一个性能比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
相关资源
最近更新 更多