自定义按位与本机 CPU 操作的性能
Performance of custom bitwise vs native CPU operations
大家好!我一直在尝试为 C++ 中的 RSA 实现创建自己的大整数 class(仅供练习)。我认为在性能方面能够很好地实现这种东西的唯一方法是使用 C++'s built-in bitwise operations (&|^), meaning implementing custom full-adders for addition, binary multipliers for multiplication, etc.
The thing I am interested in can be formulated as follows: would custom-made emulators of hardware circuits for number arithmetic (like full-adders, multipliers) using bitwise C++ operations be slower in terms of performance. In other words, if I make my own unsigned integer class of the size of 64 bits, and make it "ideal" in terms of number of bitwise operations needed to perform addition, multiplication, division on it, can it have the same performance as built-in unsigned long long?
Can it be implemented to be this fast with any programming language at all or you never will be able to make any operation faster than those in CPUs' 内部指令集?
请注意,我对有关 RSA 实现的答案不感兴趣,而只对本机算法和手工算法的性能比较感兴趣。
提前致谢!
正如 P Kramer 在他的评论中所说,这完全取决于您的系统、指令集和编译器,现代编译器非常擅长为您的特定 CPU 寻找优化,但它完全是仅通过理论无法知道他们是否会 as/better 比本地教学更好。
在这种情况下,像往常一样,我建议 A/B 测试(如果使用 gcc/clang,不要忘记使用 -march 和 -mtune)来检查哪种实现在您的机器上最快,并且多少。
软件实现甚至无法接近通常用于硬件的算术电路。这甚至不是基准测试或不同系统结果的问题(假设我们谈论的是非史前硬件),这是硬件电路的不二之选,每次都有很大的保证。硬件和软件之间的一个很大区别是:硬件几乎具有无限的并行性,因此位操作的数量并不重要,速度主要取决于电路的“深度”。软件也有并行性,但是非常有限
考虑现代硬件中使用的典型快速乘法器。它们基于一些并行缩减方案,例如 Dadda 乘法器(实际电路不一定完全遵循 Dadda 的算法,但它会使用类似的并行缩减)。硬件几乎具有无限的并行性来进行并行减少。因此,64 位乘法在许多现代机器上需要 3 个周期(不是所有机器,但例如 Apple M1 and all current Intel and AMD x64 processors)。当然,在 3 个周期内你可以压缩超过 3 个按位运算,但这甚至不是一场比赛 - 你不能仅通过少数几个按位运算来实现乘法。
连加法都已经无敌了。它已经和按位运算一样快,或者更准确地说,按位运算和加法一样慢。按位运算在软件级别花费的时间与相应门的延迟几乎没有关系,它更多的是 属性 处理器的一般设计方式。顺便说一句,您可能也对另一个问题感兴趣:Why is addition as fast as bit-wise operations in modern processors?
大家好!我一直在尝试为 C++ 中的 RSA 实现创建自己的大整数 class(仅供练习)。我认为在性能方面能够很好地实现这种东西的唯一方法是使用 C++'s built-in bitwise operations (&|^), meaning implementing custom full-adders for addition, binary multipliers for multiplication, etc.
The thing I am interested in can be formulated as follows: would custom-made emulators of hardware circuits for number arithmetic (like full-adders, multipliers) using bitwise C++ operations be slower in terms of performance. In other words, if I make my own unsigned integer class of the size of 64 bits, and make it "ideal" in terms of number of bitwise operations needed to perform addition, multiplication, division on it, can it have the same performance as built-in unsigned long long?
Can it be implemented to be this fast with any programming language at all or you never will be able to make any operation faster than those in CPUs' 内部指令集?
请注意,我对有关 RSA 实现的答案不感兴趣,而只对本机算法和手工算法的性能比较感兴趣。
提前致谢!
正如 P Kramer 在他的评论中所说,这完全取决于您的系统、指令集和编译器,现代编译器非常擅长为您的特定 CPU 寻找优化,但它完全是仅通过理论无法知道他们是否会 as/better 比本地教学更好。
在这种情况下,像往常一样,我建议 A/B 测试(如果使用 gcc/clang,不要忘记使用 -march 和 -mtune)来检查哪种实现在您的机器上最快,并且多少。
软件实现甚至无法接近通常用于硬件的算术电路。这甚至不是基准测试或不同系统结果的问题(假设我们谈论的是非史前硬件),这是硬件电路的不二之选,每次都有很大的保证。硬件和软件之间的一个很大区别是:硬件几乎具有无限的并行性,因此位操作的数量并不重要,速度主要取决于电路的“深度”。软件也有并行性,但是非常有限
考虑现代硬件中使用的典型快速乘法器。它们基于一些并行缩减方案,例如 Dadda 乘法器(实际电路不一定完全遵循 Dadda 的算法,但它会使用类似的并行缩减)。硬件几乎具有无限的并行性来进行并行减少。因此,64 位乘法在许多现代机器上需要 3 个周期(不是所有机器,但例如 Apple M1 and all current Intel and AMD x64 processors)。当然,在 3 个周期内你可以压缩超过 3 个按位运算,但这甚至不是一场比赛 - 你不能仅通过少数几个按位运算来实现乘法。
连加法都已经无敌了。它已经和按位运算一样快,或者更准确地说,按位运算和加法一样慢。按位运算在软件级别花费的时间与相应门的延迟几乎没有关系,它更多的是 属性 处理器的一般设计方式。顺便说一句,您可能也对另一个问题感兴趣:Why is addition as fast as bit-wise operations in modern processors?