星期四, 七月 30, 2009

[学习笔记]Applications of Parallel Computers - Floating Point Arithmetic and its Impact on Algorithm Design

大多数时候我们只用到了计算机,而没有去思考为什么这么使用计算机,为什么这么设计。今天学的Applications of Parallel Computers其中一课:Floating Point Arithmetic
and its Impact on Algorithm Design
,讲到了浮点数的设计和它对算法带来的影响。

历史
Turing最早在1949就提出了Backward Error Analysis,Wilkinson和W. Kahan分别因为Backward Error Analysis和IEEE754获得图灵奖。而很有意思的,Von Neumann在1947年的时候提出关于计算精度的说法是错误的。

IEEE浮点数标准
记得在自己第一次学到浮点数的时候,感受最深的是这个标准对每一位的“斤斤计较”,对于标准化后的浮点数,省下了一位,使得可以表示的数的精度可以多出一位。知道了前面的历史,这次再学习,就明白了精度对于计算的重要性。因为计算机的位数有限,所以计算机能表示的数的范围是有限的,计算得到的结果也是在一定精度范围内,而这些是计算机研究人员需要研究的问题。
IEEE基本上每隔15年左右会对它的标准进行一次重新评估(因为计算机的发展),2008年对于浮点数的标准(IEEE754)有一些修改。

误差分析
如果x1+x2的误差是epsilon,那么x1+x2+x3+x4的误差是3*epsilon。对于许多标准的算法是数值稳定的(numerically stable)。

异常处理
5种异常:1、overflow;2、underflow;3、除0;4、invalid;5、inexact
默认条件下是出了异常,继续运算。
要考虑异常的原因是因为需要解决计算不在精度范围里面的数的时候的问题。
  • 打印最大和最小的浮点数的程序的例子
在linux下,浮点数的头文件在/usr/lib/.../include下:
lhw@ubuntu:~/$ locate float.h
/usr/lib/gcc/i486-linux-gnu/4.3/include/float.h

最大的浮点数由FLT_MAX定义。
printf("  largest float : %e\n", FLT_MAX);

附加精度开销分析
在大多数平台上(AMD、Intel、UltraSpac),单精度浮点数计算比起双精度来说,快2倍左右。因为单精度计算的硬件更快、需要取的数据量少了一半、以及更好的局部性。而在GPU和Cell上,两者之间的差距更大(分别是8倍和10倍,因为GPU和Cell的数据必须从内存通过DMA送过去,GPU和Cell更加数据敏感)。
在有些时候,需要更高的精度,所以需要混合使用double和float型。目标是得到接近双精度的结果,用的是单精度的速度。解决方法是:大部分工作用单精度完成,用双精度“清理”一些需要精度的地方。
如果双精度还不够,就需要用浮点数的数组来表示一个数。

并行算法和异构算法面临的危险
不同的平台因为硬件不同会有不同的精度和signal定义。

没有评论: