Optimization 假设乘法比加法慢,使用for循环优化乘法

Optimization 假设乘法比加法慢,使用for循环优化乘法,optimization,Optimization,如果乘法比加法慢,而不是加法 7 * 8 这在理论上会提高性能吗 for(int i =0; i < 8 ; i++){ temp += 7 } 你试过并计时了吗 今天,几乎每台现代机器上都有乘法运算的快速硬件支持。所以除非它是简单的乘以2,不,否则它不会更快 要给出当前英特尔计算机上的一些硬数字,请执行以下操作: add/sub 1 cycle latency mul/imul 3 cycle latency 摘自 虽然它实际上比这复杂得多,但重点仍然是:不,用加法代替乘法不

如果乘法比加法慢,而不是加法

7 * 8
这在理论上会提高性能吗

for(int i =0; i < 8 ; i++){
temp += 7
}

你试过并计时了吗

今天,几乎每台现代机器上都有乘法运算的快速硬件支持。所以除非它是简单的乘以2,不,否则它不会更快

要给出当前英特尔计算机上的一些硬数字,请执行以下操作:

add/sub   1 cycle latency
mul/imul  3 cycle latency
摘自

虽然它实际上比这复杂得多,但重点仍然是:不,用加法代替乘法不会有任何好处

在少数情况下,如果编译器在编译时知道该值,那么它会为您进行优化(例如使用两次移位的幂乘法)


在x86上,编译器还可以使用
lea
指令进行3、5、10等的快速乘法。

您尝试过并计时了吗

今天,几乎每台现代机器上都有乘法运算的快速硬件支持。所以除非它是简单的乘以2,不,否则它不会更快

要给出当前英特尔计算机上的一些硬数字,请执行以下操作:

add/sub   1 cycle latency
mul/imul  3 cycle latency
摘自

虽然它实际上比这复杂得多,但重点仍然是:不,用加法代替乘法不会有任何好处

在少数情况下,如果编译器在编译时知道该值,那么它会为您进行优化(例如使用两次移位的幂乘法)


在x86上,编译器还可以使用
lea
指令进行3、5、10等的快速乘法。

我很难相信16值赋值、16加法和8条条件语句比处理器的7*8乘法速度快。

我很难相信16值赋值、16加法、,8个条件语句的速度比处理器可以乘以7*8的速度快。

这取决于体系结构。但是,通常循环比单个本机代码慢得多(特别是由于分支)。Intel CPU具有良好的乘法实现,因此通常优于AMD和其他CPU。你可以看看CPU的特性。此外,您还可以使用它来精确测量代码的速度

如果你真的关心速度,有时你可以近似乘法或除法。最值得注意的乘法技巧可能是位移位或查找表。e、 g.如果你想将一个数字乘以2的幂,你可以使用移位指令

如果您需要更好的东西,您可以更改number的域,例如使用量化表更改logistic域。在这种情况下,乘法变成加法,也就是说,
log(A*B)=log(A)+log(B)


这类技巧通常用于数据压缩,以估计比特概率或实现近似算术编码器。

这取决于体系结构。但是,通常循环比单个本机代码慢得多(特别是由于分支)。Intel CPU具有良好的乘法实现,因此通常优于AMD和其他CPU。你可以看看CPU的特性。此外,您还可以使用它来精确测量代码的速度

如果你真的关心速度,有时你可以近似乘法或除法。最值得注意的乘法技巧可能是位移位或查找表。e、 g.如果你想将一个数字乘以2的幂,你可以使用移位指令

如果您需要更好的东西,您可以更改number的域,例如使用量化表更改logistic域。在这种情况下,乘法变成加法,也就是说,
log(A*B)=log(A)+log(B)


这类技巧通常用于数据压缩,以估计位概率或实现近似算术编码器。

在哪些情况下,哪些硬件的乘法速度应该比加法慢?大多数合理的现代处理器都有内置乘法指令,这些指令在速度上接近加法。考虑到任何语言/平台吗?我的意思是,假设乘法比加法慢,那么我应该如何尝试改进它?如果第二项为负,则此代码将失败。
7在哪些情况下,哪些硬件可用乘法应该比加法慢?大多数合理的现代处理器都有内置乘法指令,这些指令在速度上接近加法。有什么语言/平台吗?我的意思是假设乘法比加法慢,那么我应该如何改进它?如果第二项为负数,这段代码将失败。
7我使用了7*8,这样我就可以写出问题了很容易。如果8和15111差不多呢?在我的例子中,你肯定会看到一些延迟。你会看到一个如此大的for循环比一个乘法语句有更高的延迟。现代处理器将以与7*15111相同的速度乘以7*8。for循环是指访问内存和在寄存器中移动内容的次数太多,效率不高。我使用了7*8,这样我就可以轻松地写出问题。如果8和15111差不多呢?在我的例子中,你肯定会看到一些延迟。你会看到一个如此大的for循环比一个乘法语句有更高的延迟。现代处理器将以与7*15111相同的速度乘以7*8。for循环是指访问内存并在寄存器中多次移动内容以提高效率。是的,编译器无论如何都会为这些内容生成最佳代码。有几个CPU,编译器将用
a+a
替换
a*2
,虽然不是
a>>1
,所以这里有一些事实。但这显然是一个特例——仍然很有趣