与变量长度无关的二重乘法
Double multiplication independent from the length of the variable?
我想知道双变量的长度是否会对乘法时间产生影响。出于测试目的,我编写了以下小代码:
#include <iostream>
#include <time.h>
int main() {
double x = 123.456;
double a = 1.23456;
double b = 1.234;
double d = 1.0;
// experiment 1
clock_t start = clock();
for( unsigned long long int i = 0; i < 10000000; ++i ) {
x *= a;
}
clock_t end = clock();
std::cout << "123.456*1.23456 takes " << (double)(end-start)/CLOCKS_PER_SEC << " secs" << std::endl;
// experiment 2
start = clock();
for( unsigned long long int i = 0; i < 10000000; ++i ) {
x *= b;
}
end = clock();
std::cout << "123.456*1.234 takes " << (double)(end-start)/CLOCKS_PER_SEC << " secs" << std::endl;
// experiment 3
start = clock();
for( unsigned long long int i = 0; i < 10000000; ++i ) {
x *= d;
}
end = clock();
std::cout << "123.456*1.0 takes " << (double)(end-start)/CLOCKS_PER_SEC << " secs" << std::endl;
return 0;
}
我使用VS2008编译它,在发布模式下为64位,没有优化和调试信息。结果并不奇怪:所有三种乘法持续的时间完全相同,只差几毫秒。我的问题是:为什么会这样?如果我犯了一个错误,将一个数字乘以1.0而不是1,并且我没有使用任何编译器优化,那么我的乘法将比将一个数乘以1持续更长的时间!当人类繁殖时,数字越短,我们得出的结果就越快。计算机是如何相乘的,这两个数字有多长?
除此之外,我决定检查调试是否会影响运行时速度。在这种情况下,它不会:无论是否使用DEBUG
选项进行编译,乘法总是需要完全相同的时间。
在启用优化O2
的情况下,相同的乘法只持续千分之一秒。在这种情况下,优化会做什么?如何优化C++中这样一个紧凑的双乘代码?
如果有任何解释,我将不胜感激,在C++中的二重乘法过程中会发生什么。
变量的长度始终相同,但值不同。换句话说:在硬件级别执行的操作是完全相同的,因此产生了结果。例如,整数乘以0(零输出结果,即将0传输到目标寄存器)所用时间与乘以1(将操作数复制到目标寄存器中)所用的时间相同。
浮点(单精度)为32位,双精度为64位。
http://en.wikipedia.org/wiki/IEEE_754-2008
在Intel/AMD处理器上。。。FPU(x87)或SIMDD(SSEx)将在恒定周期内计算MUL多路复用。速度取决于吞吐量、底层操作和延迟。
http://www.agner.org/optimize/instruction_tables.pdf
- FMUL-倍增FPU x87
- MULSS—乘法标量单SSEx
- MULDS—乘标量双SSEx
在启用优化\O2的情况下,相同的乘法只持续千分之一秒。在这种情况下,优化会做什么?
由于您从不使用结果(x
),因此消除所有乘法运算是完全有效的。尝试显示结果。
还要注意,您正在进行10M乘法运算,使用现代处理器,每秒至少有1G的时钟周期,在这种情况下,它执行的循环非常紧凑。
当人类繁殖时,数字越短,我们就越快结果。计算机是如何进行乘法运算的,这两个数字有多长?
计算机过去的工作方式与人类相同,一次计算一个数字,并将部分结果相加得出答案。然而,可以封装在单个芯片中的硬件数量已经发展到可以为每个数字配备专用电路的地步,这样它就可以同时并行计算每个数字。当然,这都是二进制的,但原理是一样的。
- 如何避免在仅标头库中C++类/变量重定义
- 切换大小写后如何阻止变量重置?
- 如何使用用户输入变量制作二维数组?
- C++变量在调用 x64 程序集函数后重置为 0
- 跨多个类的全局变量而不会出现重定义错误?
- 最小/最大整数和二重
- 在二重数组中递归查找负数
- 计算二重分子和分母的最准确方法
- 为什么这个正二重的腹肌等于零
- 对二重向量的向量进行排序
- 在C++中检查二重是否等于负无穷大的最佳方法
- 两个区间[a,b]之间的二重随机数生成
- 将boost用于长二重的(伪)随机数生成器
- 随机二重总是无限的
- 我怎样才能在c++中计算二重的阶乘
- 与变量长度无关的二重乘法
- c++求两个二重的标量乘积
- c++将向量归一化为二重
- 我怎样才能得到二重的精确值
- C++中的二重否定