A simple way to do compile time loop unrolling

Piotr Szturmaj bncrbme at jadamspam.pl
Fri May 31 07:33:19 PDT 2013


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.


More information about the Digitalmars-d mailing list