《编写高质量代码:改善c程序代码的125个建议》——建议21:适当地使用并行代码来优化for循环

简介:

本节书摘来自华章计算机《编写高质量代码:改善c程序代码的125个建议》一书中的第3章,建议21,作者:马 伟 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

建议21:适当地使用并行代码来优化for循环

在实际编程中,尽量把长的有依赖的代码链分解成几个可以在流水线执行单元中并行执行的没有依赖的代码链,如下面的示例代码所示:

double num[100];
double sum=0; 
int i=0; 
for (i=0;i<100;i++) 
{
    sum += num[i]; 
}

很显然,在上面的代码中要执行100次for循环语句。然而,对于这样的代码,我们可以使用分解成多路的形式进行优化。在这里,我们选择将上面的程序分解成4路,即使用4段流水线浮点加法,浮点加法的每一个段占用一个时钟周期,从而保证最大的资源利用率,如下面的示例代码所示:

double num[100];
double sum=0;
double sum1=0;
double sum2=0;
double sum3=0;
double sum4=0; 
int i=0; 
for(i=0;i<100;i+=4) 
{ 
    sum1 += num[i]; 
    sum2 += num[i+1]; 
    sum3 += num[i+2]; 
    sum4 += num[i+3]; 
} 
sum = sum4+sum3+sum2+sum1;

最后还需要说明的是,由上面的代码可以看出,因为浮点数的精确度问题,在一些情况下,这些优化可能会导致意料之外的结果。但在大部分情况下,最后结果可能只有最低位存在错误。因此,对计算结果正确性的影响不大。

相关文章