Tell gcc to specifically unroll a loop
-funroll-loops
might be helpful (though it turns on loop-unrolling globally, not per-loop). I'm not sure whether there's a #pragma
to do the same...
GCC 8 has gained a new pragma that allows you to control how loop unrolling is done:
#pragma GCC unroll n
Quoting from the manual:
You can use this pragma to control how many times a loop should be unrolled. It must be placed immediately before a for, while or do loop or a #pragma GCC ivdep, and applies only to the loop that follows. n is an integer constant expression specifying the unrolling factor. The values of 0 and 1 block any unrolling of the loop.
GCC gives you a few different ways of handling this:
Use #pragma directives, like
#pragma GCC optimize ("string"...)
, as seen in the GCC docs. Note that the pragma makes the optimizations global for the remaining functions. If you used#pragma push_options
andpop_options
macros cleverly, you could probably define this around just one function like so:#pragma GCC push_options #pragma GCC optimize ("unroll-loops") //add 5 to each element of the int array. void add5(int a[20]) { int i = 19; for(; i > 0; i--) { a[i] += 5; } } #pragma GCC pop_options
Annotate individual functions with GCC's attribute syntax: check the GCC function attribute docs for a more detailed dissertation on the subject. An example:
//add 5 to each element of the int array. __attribute__((optimize("unroll-loops"))) void add5(int a[20]) { int i = 19; for(; i > 0; i--) { a[i] += 5; } }
Note: I'm not sure how good GCC is at unrolling reverse-iterated loops (I did it to get Markdown to play nice with my code). The examples should compile fine, though.