- Infos im HLRS Wiki sind nicht rechtsverbindlich und ohne Gewähr -
- Information contained in the HLRS Wiki is not legally binding and HLRS is not responsible for any damages that might result from its use -

Compiler(Hawk): Difference between revisions

From HLRS Platforms
Jump to navigationJump to search
Line 55: Line 55:


=== Static Builds ===
=== Static Builds ===
Large jobs with thousands of processes can overload the file systems connected to the cluster during startup if the binary is linked to (many) shared libraries.
Large jobs with thousands of processes can overload the file systems connected to the cluster during startup if the binary is linked to (many) shared libraries that are stored on these file systems.


To avoid this issue and to also improve the performance by reducing the overhead from function calls from shared libraries, static builds are recommended.
To avoid this issue and to also improve the performance by reducing the overhead from function calls from shared libraries, static builds are recommended.
Line 69: Line 69:
# Staticaclly link libm.a
# Staticaclly link libm.a
<compiler> ... -l:libm.a
<compiler> ... -l:libm.a
</pre>
Or provide the full path to the static library
# Staticaclly link libm.a
<compiler> ... /path/to/static/lib/libm.a
</pre>
</pre>



Revision as of 14:21, 2 November 2019

We highly recommend to try as much different compilers as possible and compare the performance of the generated code! If you code according to language standards, this is almost for free but can give you a significant speedup! There is no such thing as an "ideal" compiler! One suites better to application A, one suites better to application B (cf. Best Practice Guide AMD EPYC (Naples)).


Please note that compilers do not use optimization flags by default at the moment. Hence, please refer to Compiler Options Quick Reference Guide and set the respective flags on your own (with znver1 for Naples and znver2 for Rome nodes). Compiler Usage Guidelines for AMD64 Platforms might also be a source of inspiration w.r.t. optimization flags.


Compilers

GNU

Make sure to load a more up to date version of the GNU Compiler Collection than the one preinstalled in the system

module load compiler/gnu/9.1.0

Then compile with

<compiler> -march=znver2


AOCC

AOCC is the AMD Optimizing C/C++ Compiler based on LLVM. It contains a Fortran compiler (flang) as well.

Load aocc module

module load compiler/aocc/2.0.0

Compile with

clang/clang++/flang -march=znver2

AOCC comes with a couple of exclusive compiler flags that are not part of LLVM and allow more aggressive optimizations, they are listed in the C/C++ and Fortran compiler manual.


Intel

Please use

<compiler> -march=core-avx2

and do not use

<compiler> -xCORE-AVX2

since the latter might give very bad performance!


PGI

With respect to PGI, we recommend to use

<compiler> -tp=zen -O3

Compiler Options for High Performance Computing

This section shows compiler flags for GNU-compatible compilers (gnu, aocc, intel), other compilers may have other options for the described functionality.


Static Builds

Large jobs with thousands of processes can overload the file systems connected to the cluster during startup if the binary is linked to (many) shared libraries that are stored on these file systems.

To avoid this issue and to also improve the performance by reducing the overhead from function calls from shared libraries, static builds are recommended.

During link-time, you can set the compiler to prefer static libraries over shared libraries if both are found in the library search path with

# Link libm statically if available, set back to prefer shared libraries again after (default)
<compiler> ... -Wl,-Bstatic -lm -Wl,-Bdynamic

You can also specify a static library filename in the library search path directly

# Staticaclly link libm.a
<compiler> ... -l:libm.a

Or provide the full path to the static library

  1. Staticaclly link libm.a

<compiler> ... /path/to/static/lib/libm.a

Keep in mind that all the symbols referenced in the static library need to be resolved during linking. Thus, linking to additional (static) libraries may be required.


Link-Time Optimization (LTO)

This technique allows the compiler to optimize the code at link time. During this, further rearrangement of the code from separate object files is performed.

The option needs to be set at compile time and link time:

# Compile with LTO in mind
<compiler> -flto -o component1.o -c component1.c
<compiler> -flto -o component2.o -c component2.c

# Link with LTO
<compiler> -flto -o program component1.o component2.o


Profile Guided Optimization

TODO