我先分享一个使用并行代码
尽可能把长的有依赖的代码链分解成几个可以在流水线执行单元中并行执行的没有依赖的代码链。很多高级语言,包括 C++ ,并不对产生的浮点表达式重新排序,因为那是一个相当复杂的过程。需要注意的是,重排序的代码和原来的代码在代码上一致并不等价于计算结果一致,因为浮点操作缺乏精确度。在一些情况下,这些优化可能导致意料之外的结果。幸运的是,在大部分情况下,最后结果可能只有最不重要的位(即最低位)是错误的。
不好的代码:
double a[100] , sum ;
int i ;
sum = 0.0f ;
for (i=0 ; i<100 ; i++)
sum += a ;
推荐的代码:
double a[100] , sum1 , sum2 , sum3 , sum4 , sum ;
int i ;
sum1 = sum2 = sum3 = sum4 = 0.0 ;
for (i = 0 ; i < 100 ; i += 4)
{
sum1 += a ;
sum2 += a[i+1] ;
sum3 += a[i+2] ;
sum4 += a[i+3] ;
}
sum = (sum4+sum3)+(sum1+sum2) ; |