gpt4 book ai didi

c++ - 在 64 位处理器上不使用 double(而是使用 float 代替)有什么好处吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:59:56 25 4
gpt4 key购买 nike

我总是使用 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 快两倍。

最佳答案

有几种方法可以使它们更快:

  • 更快的 I/O:您只有一半的位可以在磁盘/内存/缓存/寄存器之间移动
  • 通常,唯一较慢的运算是平方根和除法。例如,在 Haswell 上,DIVSS(浮点除法)需要 7 个时钟周期,而 DIVSD(双除法)需要 8-14 个时钟周期(来源:Agner Fog's tables) .
  • 如果您可以利用 SIMD 指令,则每条指令可以处理两倍的数量(即在 128 位 SSE 寄存器中,您可以对 4 个 float 进行操作,但只能对 2 个 double 进行操作)。
  • 特殊函数(logsin)可以使用低阶多项式:例如log 的 openlibm 实现使用 7 次多项式,而 logf只需要4度。
  • 如果您需要更高的中间精度,您可以简单地将float 提升为double,而对于double,您需要software double-double。 ,或较慢的 long double

请注意,这些要点也适用于 32 位架构:与整数不同,格式的大小与您的架构匹配没有什么特别的,即在大多数机器上, double 与 float 一样“原生”。

关于c++ - 在 64 位处理器上不使用 double(而是使用 float 代替)有什么好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32337892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com