【发布时间】:2013-05-08 10:45:40
【问题描述】:
我一直在编写一些 cython 代码来实现我想在 python 中使用的多精度数组运算(主要是点积和矩阵求逆)。我使用 mpfr 作为底层 C 库,通过在 C 和 Cython 中进行测试,我发现 mpfr(以 200 位精度)比 numpy(以机器精度)慢 50-200 倍(取决于操作)。我知道 mpfr 非常快,但我仍然发现这个开销非常大。由于我的需求非常有限(固定精度,只有基本操作,如加法、乘法等),我想知道我是否可以手动编写一些多精度操作(不考虑仔细舍入等)。不幸的是,这涉及很多工作,所以我希望在 C 或英特尔汇编中找到一些免费的代码 sn-ps 来进行基本的多精度算术。我将不胜感激任何提及后者或我应该或不应该采用这种方法的原因。
更新:我应该提到我已经尝试过 QD 库,它实际上(稍微)慢于类似精度(212 位)的 MPFR。我想这一定是由于 C++ 开销。
【问题讨论】:
-
将 200 位精度与机器精度进行比较,就是将苹果与橙子进行比较。 50-200 倍的速度惩罚对我来说似乎并不罕见。即使您只想支持像乘法这样的“简单”操作,我怀疑您会打败它。
-
我不明白为什么有些用户投票结束这个问题。它有什么问题? OP 正在使用 MPFR,但发现它超出了她/他的需要。 OP 非常清楚,他/她期望能够更快地为他/她找到的原因是他/她没有使用 MPFR 提供的所有功能。事实证明,其他人已经感受到了同样的需求,甚至至少存在一种即用型替代方案。
-
@MatthewD 双双加法需要一些双加法来计算。如果 FMA 指令可用(如在 PowerPC 处理器和最近的 Intel/AMD 桌面处理器中发现的),双双乘法也只需要几条指令。
-
感谢 Pascal,这正是我的推理。我已经看到(在另一个 SO 线程上)有人为 128 位操作提供了一些 CUDA 汇编指令,他们声称这是大约 16 条指令,所以我希望减速的顺序而不是 100-200 次。即使使用 120 位,我的速度也会显着下降 (60-100x)。
-
尝试分析您的程序以找出哪些 MPFR 函数使用时间最长。
标签: c assembly arbitrary-precision