我想知道当两个数字中至少有一个为零时,当前的CPU是否避免将两个数字相乘。谢谢
这根据 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);
}
由于循环仅在当/如果时执行temp1 != 0
,循环显然不会执行如果temp1
开始时为 0(但如此处所写,不会尝试对其他操作数为 0 进行任何优化)。
然而,这从根本上来说是一次一位的算法。例如,当乘以 32 位操作数时,如果每个位被设置的机会为 50:50,我们预计平均大约有 16 次迭代。
较新的高端 CPU 通常一次至少使用两位,甚至可能更多。它通常不会使用单个硬件执行多次迭代,而是通常为乘法的每个阶段使用单独的(尽管本质上相同)硬件来管道化操作(尽管这些通常不会在正常的流水线图上显示为单独的阶段)对于处理器)。
这意味着无论操作数如何,执行都将具有相同的延迟(和吞吐量)。平均而言,它稍微改善了延迟并大大改善了吞吐量,但确实导致每个操作都以相同的速度发生,而不管操作数如何。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)