【发布时间】: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