GCC

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

compile_c.sh
#!/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++

compile_cpp.sh
#!/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

compile_fortran.sh
#!/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

compile_omp.sh
#!/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

compile_mpi.sh
#!/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

compile_with_libs.sh
#!/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

GCC optimization flags

Flag

Description

-O0

No optimization (default)

-O1

Basic optimization

-O2

Recommended optimization (good balance)

-O3

Aggressive optimization (maximum speed)

-Os

Size optimization

-march=native

Optimize for current architecture

-mtune=native

Tune for current architecture

-funroll-loops

Unroll loops (may increase speed)

-ffast-math

Aggressive math optimizations

Job for Compiling and Running

compile_and_run.sh
#!/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

test_flags_array.sh
#!/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

See also