有时候,可以牺牲一点代码的简洁度、减少循环控制语句的执行频率以提高性能。 无依赖的循环展开: process(array[0]);
process(array[1]);
process(array[2]);
process(array[3]);
优于: for (int i = 0; i < 4; i++)
{
process(array[i]);
}
有依赖的循环展开: long calc_sum(int *a, int *b)
{
long sum0 = 0;
long sum1 = 0;
long sum2 = 0;
long sum3 = 0;
for (int i = 0; i < 250; i += 4)
{
sum0 += arr0[i + 0] * arr1[i + 0];
sum1 += arr0[i + 1] * arr1[i + 1];
sum2 += arr0[i + 2] * arr1[i + 2];
sum3 += arr0[i + 3] * arr1[i + 3];
}
return (sum0 + sum1 + sum2 + sum3);
}
优于: long calc_sum(int *a, int *b)
{
long sum = 0;
for (int i = 0; i < 1000; i ++)
{
sum += arr0[i] * arr1[i];
}
return sum;
}
尽可能把长的有依赖的代码链分解成几个可以在流水线执行单元中并行执行的没有依赖的代码链,提高流水线的连续性。通常4次展开为最佳方式。
|