I use the project AdvanceCOMP . The question arose how to increase the performance of this project during compilation.

Now I do this:

CFLAGS='-Ofast -flto' CXXFLAGS='-Ofast -flto' LDFLAGS='-static -flto' ./configure make 

Help from ./configure -h

 `configure' configures AdvanceCOMP 1.20 to adapt to many kinds of systems. Usage: ./configure [OPTION]... [VAR=VALUE]... To assign environment variables (eg, CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print `checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for `--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or `..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [/usr/local] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, `make install' will install all the files in `/usr/local/bin', `/usr/local/lib' etc. You can specify an installation prefix other than `/usr/local' using `--prefix', for instance `--prefix=$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/advancecomp] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --disable-largefile omit support for large files --enable-bzip2 Use the bzip2 compression --enable-valgrind enable the use of valgrind in testing --enable-debug enable debugging Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, eg -L<lib dir> if you have libraries in a nonstandard directory <lib dir> LIBS libraries to pass to the linker, eg -l<library> CPPFLAGS (Objective) C/C++ preprocessor flags, eg -I<include dir> if you have headers in a nonstandard directory <include dir> CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags TESTENV Test environment Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. AdvanceCOMP home page: <http://www.advancemame.it>. 
  • four
    I would venture to suggest that optimizing the code itself will give a much greater performance boost ... - Vladimir Martyanov
  • (1) try profile guided optimization ( -fprofile-* ). (2) try to better optimize the algorithms, rewrite O (n ^ 2) to O (log n) (are all the algorithms already improved to impossibility?). (3) Use the profiler to find bottlenecks and manually optimize them. Do not expect that low-level compiler optimization is better than the high-level optimization that you do. - VladD

2 answers 2

The -Ofast flag -Ofast not recommended, as it is considered unsafe (includes optimizations that violate the compatibility with the standard).

There are a bunch of different flags, but they should be used depending on the target architecture and wisely.

I quite often use the following set in order to get the maximum performance of an application on the x86 architecture:

-march = native -O3 -mfpmath = both -funroll-loops -fopenmp -floop-parallelize-all -D_GLIBCXX_PARALLEL -D_GLIBCXX_MERGESORT

They do not require user intervention in the program code.

  • You could not help yet with mozjpeg. I do it like this cmake -G "MSYS Makefiles" make How can I increase my performance? - lorents
  • If it is not difficult write to the post office lorents!7@mail.ru - lorents
  • @lorents I'm new to CMake. You'd better ask a new question about this. - Anton Sazonov
  • Got it! Thanks again! - lorents

Try the OpenMP version of STL. Just add the -D_GLIBCXX_PARALLEL flag and install the necessary libraries for OpenMP, and all standard algorithms will be replaced with parallel ones.

More details here: https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode_using.html

Try another build under C ++ 11.

And so, of course you need to profile the code.

  • Thank you for your reply! I was just thinking about OpenMP, you do not tell me, How to install it on MSYS2? - lorents
  • Perhaps nothing will have to be added, OpenMP support depends on the compiler version. There is a small example of a test program under openmp and how to build it under Windows ipd.uni-karlsruhe.de/multicore/research/download/… - Denis Zaikin
  • I get this error. $ ./configure -D_GLIBCXX_PARALLEL configure: error: unrecognized option: -D_GLIBCXX_PARALLEL' Try ./configure --help' for more information - lorents
  • It is necessary to set the flags: CFLAGS = '- Ofast-flto -D_GLIBCXX_PARALLEL
  • Thank you very much! I will go to test the speed of work! Prompt as correct: $ CFLAGS = '- Ofast -flto -D_GLIBCXX_PARALLEL'. CXXFLAGS = '- Ofast -flto -D_GLIBCXX_PARALLEL' LDFLAGS = '- static -Ofast -flto -D_GLIBCXX_PARALLEL-ate your - your_text -G_LIBCXX_PARALLEL =. D_GLIBCXX_PARALLEL 'CXXFLAGS =' - Ofast -flto -D_GLIBCXX_PARALLEL 'LDFLAGS =' - static './configure - lorents