GCC
In this section:
Description
GCC (GNU Compiler Collection) is a collection of compilers for programming languages such as C, C++, Fortran, Ada, and others. It is free software and widely used on Unix-like systems.
Available Versions
gcc/5.3.0
gcc/7.2.0 (default)
gcc/9.3.0
gcc/10.2.0
gcc/11.5.0
gcc/13.2.0
gcc/14.3.0
gcc/15.1.0
Loading Modules
# Load specific version
module load gcc/10.2.0
# Verify version
gcc --version
# Available compilers
which gcc # C compiler
which g++ # C++ compiler
which gfortran # Fortran compiler
Basic Compilation
C
#!/bin/bash
#SBATCH -J compile_c
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 00:10:00
#SBATCH --mem=2G
export INPUT="program.c"
export OUTPUT="program"
module load gcc/10.2.0
job-nanny gcc -O3 -march=native -o program program.c
C++
#!/bin/bash
#SBATCH -J compile_cpp
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 00:10:00
#SBATCH --mem=2G
export INPUT="program.cpp"
export OUTPUT="program"
module load gcc/10.2.0
job-nanny g++ -O3 -march=native -std=c++11 -o program program.cpp
Fortran
#!/bin/bash
#SBATCH -J compile_fortran
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 00:10:00
#SBATCH --mem=2G
export INPUT="program.f90"
export OUTPUT="program"
module load gcc/10.2.0
job-nanny gfortran -O3 -march=native -o program program.f90
Compilation with OpenMP
#!/bin/bash
#SBATCH -J compile_omp
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 00:10:00
#SBATCH --mem=2G
export INPUT="program_omp.c"
export OUTPUT="program_omp"
module load gcc/10.2.0
job-nanny gcc -fopenmp -O3 -march=native -o program_omp program_omp.c
Compilation with MPI
#!/bin/bash
#SBATCH -J compile_mpi
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 00:10:00
#SBATCH --mem=2G
export INPUT="program_mpi.c"
export OUTPUT="program_mpi"
module load gcc/10.2.0
module load openmpi/4.1.5
job-nanny mpicc -O3 -march=native -o program_mpi program_mpi.c
Compilation with External Libraries
#!/bin/bash
#SBATCH -J compile_libs
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 00:20:00
#SBATCH --mem=4G
export INPUT="program.c"
export OUTPUT="program"
module load gcc/10.2.0
module load gsl/2.6
module load boost/1.70.0
job-nanny gcc -O3 -march=native -o program program.c \
-lgsl -lgslcblas -lm -I$BOOST_ROOT/include -L$GSL_LIB
Common Optimization Flags
Flag |
Description |
|---|---|
|
No optimization (default) |
|
Basic optimization |
|
Recommended optimization (good balance) |
|
Aggressive optimization (maximum speed) |
|
Size optimization |
|
Optimize for current architecture |
|
Tune for current architecture |
|
Unroll loops (may increase speed) |
|
Aggressive math optimizations |
Job for Compiling and Running
#!/bin/bash
#SBATCH -J compile_run
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 01:00:00
#SBATCH --mem=4G
export INPUT="simulation.c data.dat"
export OUTPUT="result.dat"
module load gcc/10.2.0
# Compile
job-nanny gcc -O3 -march=native -o simulation simulation.c -lm
# Run
./simulation < data.dat > result.dat
Job Array for Testing Different Flags
#!/bin/bash
#SBATCH -J test_flags
#SBATCH --array=1-6
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 00:30:00
#SBATCH --mem=4G
FLAGS=("-O0" "-O1" "-O2" "-O3" "-Os" "-O2 -march=native")
FLAG=${FLAGS[$SLURM_ARRAY_TASK_ID-1]}
export INPUT="benchmark.c"
export OUTPUT="benchmark_flag_${SLURM_ARRAY_TASK_ID}/"
module load gcc/10.2.0
mkdir -p benchmark_flag_${SLURM_ARRAY_TASK_ID}
cd benchmark_flag_${SLURM_ARRAY_TASK_ID}
# Compile with specific flag
job-nanny gcc $FLAG -o benchmark ../benchmark.c
# Run and measure time
time ./benchmark > performance.txt 2>&1
References
Documentation: https://gcc.gnu.org/onlinedocs/
GCC Manual: https://gcc.gnu.org/onlinedocs/gcc/
Optimization options: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
See also
Intel - Intel compilers
OpenMPI - MPI with GCC
Running Simulations - How to submit jobs