Reputation: 20286
Is there a way to enable vectorization only for some part of the code, like a pragma directive? Basically having as if the -ftree-vectorize is enabled only while compiling some part of the code? Pragma simd for example is not available with gcc...
The reason is that from benchmarking we saw that with -O3 (which enables vectorization) the timings were worse than with -O2. But there are some part of the code for which we would like the compiler to try vectorizing loops.
One solution I could use would be to restrict the compiler directive to one file.
Upvotes: 3
Views: 1371
Reputation: 33669
Yes, this is possible. You can either disable it for the whole module or individual functions. You can't however do this for particular loops.
For individual functions use
__attribute__((optimize("no-tree-vectorize")))
.
For whole modules -O3
automatic enables -ftree-vectorize
. I'm not sure how to disable it once it's enabled but you can use -O2
instead. If you want to use all of -O3
except -ftree-vectorize
then do this
gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts
gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts
diff /tmp/O2-opts /tmp/O3-opts | grep enabled
And then include all the options except for -ftree-vectorize
.
Edit: I don't see -fno-tree-vectorize
in the man pages but it works anyway so you can do -O3 -fno-tree-vectorize
.
Edit: The OP actually wants to enable vectorization for particular functions or whole modules. In that case for individual functions __attribute__((optimize("tree-vectorize")))
can be used and for whole modules -O2 -ftree-vectorize
.
Edit (from Antonio): In theory there is a pragma directive to enable tree-vectorizing all functions that follow
#pragma GCC optimize("tree-vectorize")
But it seems not to work with my g++ compiler, maybe because of the bug mentioned here: How to enable optimization in G++ with #pragma. On the other hand, the function attribute works.
Upvotes: 4