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.
