Owe*_*020 12 c x86-64 clang bigint extint
我正处于一个项目的设计阶段,该项目需要执行大量简单的 256 位整数运算(仅加、子、多、分),并且需要针对这四个操作进行合理优化的东西。
我已经熟悉 GMP、NTL 和大多数其他重量级 bignum 实现。然而,这些实现的开销促使我做我自己的低级实现——我真的不想这样做;众所周知,这东西很难做对。
在我的研究中,我注意到 Clang 中新的扩展整数类型 - 我是 gcc 用户 - 我想知道是否有人对现实生活中的扩展整数有任何经验,愤怒的实现?它们是否针对“明显的”位大小(256、512 等)进行了优化?
我在 linux 下的 x-64 上使用 C 语言(目前是 Ubuntu,但如果需要,可以向其他发行版开放)。我主要使用 gcc 进行生产工作。
编辑添加:@phuclv 确定了以前的答案C++ 128/256-bit fixed size integer types。(感谢@phuclv。)这个q/a 侧重于c++ 支持;我希望确定是否有人对新的 Clang 类型有任何特定的经验。
看起来目前不支持超过 128 位的这些类型的划分。
截至2020年8月2日,在godbolt上使用clang trunk,为x86-64编译以下代码
typedef unsigned _ExtInt(256) uint256;
uint256 div(uint256 a, uint256 b) {
return a/b;
}
Run Code Online (Sandbox Code Playgroud)
失败并显示错误消息
fatal error: error in backend: Unsupported library call operation!
Run Code Online (Sandbox Code Playgroud)
同样的事情发生在_ExtInt(129)我尝试过的所有更大的东西上。 _ExtInt(128)和更小似乎工作,虽然他们调用内部库函数__udivti3而不是内联。
它已被报告为LLVM 错误 45649。该页面上有一些讨论,但结果似乎是他们真的不想编写完整的任意精度除法指令。
加法、减法和乘法_ExtInt(256)在此版本中适用。
| 归档时间: |
|
| 查看次数: |
662 次 |
| 最近记录: |