Search code examples
c++gccssepragma

Can I enable vectorization only for one part of the code?


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.


Solution

  • 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.