[讨论] 关于循环展开对性能的影响?

12 views
Skip to first unread message

Hui Wang

unread,
Feb 7, 2012, 1:06:46 AM2/7/12
to gamed...@googlegroups.com
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)又应该如何选择呢?

Milo Yip

unread,
Feb 7, 2012, 3:17:32 AM2/7/12
to gamed...@googlegroups.com
有些時候有必要手動展開。

有時候這麼分開會令並行性更好:

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/

Reply all
Reply to author
Forward
0 new messages