我想知道当前cpus当至少其中一个为零时,是否避免将两个数相乘。感谢
答案 0 :(得分:8)
现代CPU - 你的意思是什么?你的意思是最常用的(如x86,AMD64,ARM)或最近开发的。每个处理器架构都有自己的属性。此外,每个公司(如英特尔或AMD)都可以使处理器处于不同的状态(通常是公司秘密)。
当你提出疑问时,我对此表示怀疑。你知道,如果考虑到乘法操作的实际优化百分比有多低,那么在每次乘法过多之前,甚至检查数字是否等于零两次。
这样的优化会使CPU变得更加昂贵。
假设平均程序中有1%的乘法乘以零(并且可能低得多)。这意味着对零的比较必须比乘以仅考虑开销快200倍(并且在实践中这更有用)。
我认为你从人的角度来看这个问题太过分了。当你乘以时,你清楚地看到其中一个被乘数为零并得出结论。但是,与计算机有很大不同。计算机实际上必须检查所有64位或32位以确保某些内容等于零。
答案 1 :(得分:1)
这取决于CPU和(在某些情况下)操作数的类型而有很大差异。
较旧/较简单的CPU通常使用如下的乘法算法:
integer operator*(integer const &other) {
unsigned temp1 = other.value;
unsigned temp2 = value;
unsigned answer = 0;
while (temp1 != 0) {
if (temp1 & 1)
answer += temp2;
temp2 <<= 1;
temp1 >>=1;
}
return integer(answer);
}
由于循环仅在/ if temp1 != 0
时执行,如果temp1
从0开始,循环显然不会执行(但是这里写的,不会尝试对其他操作数进行任何优化)是0)。
较新的高端CPU通常一次至少使用两位,甚至可能更多。而不是单个硬件执行多次迭代,它通常会为乘法的每个阶段使用单独的(尽管是基本相同的)硬件来管理操作(尽管这些硬件通常不会在正常流水线图上显示为单独的阶段对于处理器)。
这意味着无论操作数如何,执行都将具有相同的延迟(和吞吐量)。平均而言,它可以稍微改善延迟和吞吐量,但无论操作数如何,都会导致每个操作以相同的速度发生。
答案 2 :(得分:-2)
我希望现代桌面CPU能有这样的东西。