【发布时间】:2015-03-11 11:18:07
【问题描述】:
SSE/AVX 寄存器可以被视为整数或浮点 BigNums。也就是说,人们完全可以忽略存在车道。是否存在一种简单的方法来利用这种观点并将这些寄存器单独或组合用作 BigNums?我问是因为从我对 BigNum 库的了解来看,它们几乎普遍地在数组上存储和执行算术运算,而不是在 SSE/AVX 寄存器上。便携性?
例子:
假设您将 SSE 寄存器的内容作为密钥存储在 std::set 中,您可以将这些内容作为 BigNum 进行比较。
【问题讨论】:
-
当然有可能,只是非常不方便、效率低下而且速度慢。当您对 limbs(32/64 位字)数组进行加法时,很容易使用 x86 进位标志来传播进位位。 SSE 寄存器的通道没有有进位标志,这意味着必须以不同的方式检测溢出(计算量更大),即使你确实检测到溢出,你也会遇到复杂的 SSE/ AVX 洗牌以提升进位,您必须为
N-limb bignums 执行此操作N-1次。那么如果你需要将一个 bignum 扩展到 128 位/256 位之外会发生什么...? -
您使用 gcc/clang/icc vector extensions 将 2 个或更多寄存器连接在一起。你可以写一个答案,为什么你认为这是不切实际的。问题是,我认为 gcc 将数组映射到 SIMD 寄存器很糟糕,但它很容易将 SIMD 寄存器映射到相反的方向并且没有任何问题。
-
您链接到的不是在运行时动态扩展 bignum 的方法。您链接到的是一种在编译时声明有限和固定大小向量(带通道)的方法。您仍然遇到我上面列出的完全相同的问题,并且您仍然无法使用这些扩展轻松检测和传播从下肢到上肢的携带。
-
好的,+1,请写一个答案,我会接受。
标签: sse biginteger simd avx extended-precision