【发布时间】:2015-09-01 17:46:20
【问题描述】:
我总是使用 double 来进行计算,但 double 提供的准确度比我需要的要高得多(或者说是有道理的,因为我所做的大多数计算都是以近似值开始的)。
但由于处理器已经是 64 位,我不认为使用位数较少的类型会有任何好处。
我是对还是错,我将如何优化速度(我知道较小的类型会更节省内存)
这是测试
#include <cmath>
#include <ctime>
#include <cstdio>
template<typename T>
void creatematrix(int m,int n, T **&M){
M = new T*[m];
T *M_data = new T[m*n];
for(int i=0; i< m; ++i)
{
M[i] = M_data + i * n;
}
}
void main(){
clock_t start,end;
double diffs;
const int N = 4096;
const int rep =8;
float **m1,**m2;
creatematrix(N,N,m1);creatematrix(N,N,m2);
start=clock();
for(int k = 0;k<rep;k++){
for(int i = 0;i<N;i++){
for(int j =0;j<N;j++)
m1[i][j]=sqrt(m1[i][j]*m2[i][j]+0.1586);
}
}
end = clock();
diffs = (end - start)/(double)CLOCKS_PER_SEC;
printf("time = %lf\n",diffs);
delete[] m1[0];
delete[] m1;
delete[] m2[0];
delete[] m2;
getchar();
}
double 和 float 没有时间差,但是不使用平方根时,float 的速度是原来的两倍。
【问题讨论】:
-
/和sqrt之类的操作对于double而言通常比float慢得多 - 检查您对目标 CPU 感兴趣的操作的吞吐量/延迟。 -
当你使用它们很多时,缓存利用率会更好。矢量化代码也可以表现得更好。只有在您知道自己在做什么时才对数学模型进行修补,这很少是随意的选择。
-
@PaulR 我更新了我的帖子并进行了测试。 double 和 float 几乎没有时差。
-
我刚发现sqrt的float版本是sqrtf,这导致时间减少了20%
-
如果你在循环中加入除法运算,你可能会看到更大的差异,例如将
+0.1586更改为/0.1586(或/0.1586f用于float版本)。
标签: c++ floating-point 64-bit double