參考原廠手冊的說法我還是不太清楚這個指令做了什麼事情
#pragma unroll 2
for(int i=0;i<6;i++)
sum += array[i] ;
我一直以為加了#pragma unroll 2會自動變成嗎
for(int i=0;i<3;i++)
{
sum1 += array[i] ;
}
for(int i=3;i<6;i++)
{
sum2 += array[i] ;
}
sum = sum1 +sum2;
如果是#pragma unroll 6
sum = array[0] + array[1] + array[2] + array[3] + array[4] + array[5];
我自己有試過手動指令層級的展開
for(int i=0;i<3;i++)
{
sum1 += array[i] ;
sum2 += array[i+1] ;
}
sum = sum1 +sum2;
效果似乎會比#pragma unroll N還要好很多,因此我就不太清楚他做了什麼
上面只是舉例而已。
我的經驗是當for i = 1 : N 時做 #pragma unroll N 不見得會比#pragma unroll N/k 還要好 (mod(N,k)=0)
反而是自己先手動做k次的展開後再加上#pragma unroll N/k 效果會最好
我想請問一下再使用#pragma unroll N 時有沒有一個比較確切的依據或準則可以參考?
又或者我有兩層for迴圈那要哪一層去做#pragma unroll N ?