W dniu 31.05.2013 16:06, finalpatch pisze:
Just want to share a new way I just discovered to do loop unrolling.

template Unroll(alias CODE, alias N)
{
     static if (N == 1)
         enum Unroll = format(CODE, 0);
     else
         enum Unroll = Unroll!(CODE, N-1)~format(CODE, N-1);
}

after that you can write stuff like

mixin(Unroll!("v[%1$d]"~op~"=rhs.v[%1$d];", 3));

and it gets expanded to

v[0]+=rhs.v[0];v[1]+=rhs.v[1];v[2]+=rhs.v[2];

I find this method simpler than with foreach() and a tuple range, and
also faster because it's identical to hand unrolling.

The advantage of foreach unrolling is that compiler can optimally choose unrolling depth as different depths may be faster or slower on different CPU targets. It is also an opportunity to do loop vectorization. But I doubt that either is available in DMD, not sure about GDC and LDC.

Reply via email to