uint32 sum = 0;
uint32 i= 0;
//@code 1
for (i=0; i<66666; ++i)
{
sum += p[a];
}
//@code 2
for (i=0; i<66666; i+=2)
{
sum += p[a];
sum += p[a+1];
}
//@code 3
for (i=0; i<66666; i+=4)
{
sum += p[a];
sum += p[a+1];
sum += p[a+2];
sum += p[a+3];
}
sum += p[a];
sum += p[a+1]; 代码段@code 1,@code 2,@code 3完成的功能显然相同,但是效率差别还是很大的。
在效率要求比较高的实现中,是否有必要对循环进行展开优化?可否通过宏或者其他的方式根据循环次数自动的完成循环展开?循环展开深度(++i,i+=2,i+=4)又应该如何选择呢?
有時候這麼分開會令並行性更好:
for (i=0; i<66666; i+=2)
{
sum1 += p[i];
sum2 += p[i+1];
}
sum = sum1 + sum2;
具體要看CPU架構及loop裡的內容,只能通過profiling去決定哪一個好。
另外,這段代碼可以使用SIMD進行優化。
2012/2/7 Hui Wang <hui.wa...@gmail.com>:
--
Milo Yip
http://www.cnblogs.com/miloyip/
http://weibo.com/miloyip/
http://twitter.com/miloyip/