Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to unroll a short loop in C++

I wonder how to get something like this:

  1. Write

    copy(a, b, 2, 3)
    
  2. And then get

    a[2] = b[2];
    a[3] = b[3];
    a[4] = b[4];
    

I know that C #defines can't be used recursively to get that effect. But I'm using C++, so I suppose that template meta-programming might be appropriate.

I know there is a Boost library for that, but I only want that "simple" trick, and Boost is too "messy".

like image 648
cibercitizen1 Avatar asked Mar 04 '10 19:03

cibercitizen1


People also ask

What is pragma unroll?

The UNROLL pragma specifies to the compiler how many times a loop should be unrolled. The UNROLL pragma is useful for helping the compiler utilize SIMD instructions. It is also useful in cases where better utilization of software pipeline resources are needed over a non-unrolled loop.

What is loop overhead?

Loop overhead, i.e., incrementing and testing of the loop counter, is reduced. Reducing jumps back to a loop's entry might improve the pipeline behavior. Unrolling makes instruction-level parallelism in loops explicit and thus potentially enables other compiler optimizations.


1 Answers

The most straightforward solution to this is to write a loop where the start and end values are known:

for(int i = 2; i <= 4; i++) {
  a[i]=b[i]; 
}

I think this is better than any sort of template/runtime-call mixture: The loop as written is completely clear to the compilers' optimizer, and there are no levels of function calls to dig through just to see what's going on.

like image 74
5 revs, 2 users 95% Avatar answered Sep 27 '22 17:09

5 revs, 2 users 95%