Compiling Code on ALICE and SPECTRE
Compiler names
| Language | GCC | Intel |
|---|---|---|
| C | gcc | icc |
| C++ | g++ | icpc |
| F77 | gfortran | ifort |
| F90 | gfortran | ifort |
| F95 | gfortran | ifort |
GNU Compiler Collection
Two versions of the GNU Compiler Collection are available: 4.3.4 and 4.1.1. In general you will want to use the most recent version. However there have been changes to the library interfaces so you may find you need version 4.1.1 in some cases.
To use the GCC compilers, enter:
module load gcc/4.3.4
or
module load gcc/4.1.1
depending on which version you are using.
Intel Compilers
To use the Intel compilers, enter:
module load intel/64/compiler
However if you also want to link to the Intel Maths Kernel Libraries (MKL), use the Profiling tools (ITAC) or Intel MPI (IMPI) it is simpler to load the meta-module:
module load intel/64/suite
This will load the recommended version of all the Intel Cluster Toolkit modules.
It is recommended that you use the Intel MKL Link Advisor to create your link lines. It can be difficult to link against MKL and this will give you a good starting point.
Recommended values for the Link advisor:
| Field | Recommended values |
|---|---|
| Select OS: | Linux |
| Select processor architecture: | Intel 64 |
| Select compiler: | Intel | GNU C | GNU Fortran |
| Select dynamic or static linking | dynamic | static |
| Select your integers length: | 32-bit (lp64) |
| Select sequential or multi-threaded | sequential | multi-threaded |
| Select OpenMP library: |
iomp5 (may not be needed) |
| Select Cluster library: | Scalapack (may not be needed) |
| Select MPI library: | Intel MPI | Open MPI (may not be needed) |
Once you have entered your values the link advisor will provide you with a list of linker options, for example:
-L$MKLPATH $MKLPATH/libmkl_solver_lp64_sequential.a \ -Wl,--start-group -lmkl_intel_lp64 -lmkl_sequential -lmkl_core \ -Wl,--end-group -lpthread
These can be used directly if you are linking from the command line, for example:
> ifort -L$MKLPATH $MKLPATH/libmkl_solver_lp64_sequential.a \ -Wl,--start-group -lmkl_intel_lp64 -lmkl_sequential -lmkl_core \ -Wl,--end-group -lpthread mycode.f90 -o mycode.exe
If you are using a Makefile rather than linking directly at the command line, you need to add the above linker options to the LDFLAGS, CFLAGS or FFLAGS variable in your Makefile. You will also need to change references to $MKLPATH to $(MKLPATH), so that the make command understands them.
MPI
There are four implementations of MPI available:
- OpenMPI + Intel Compilers
- OpenMPI + GNU Compilers
- IntelMPI + Intel Compilers (recommended for performance)
- IntelMPI + GNU Compilers
MPI wrapper scripts for the different implementations:
| Language | Open MPI + Any | Intel MPI + GCC | Intel MPI + Intel |
|---|---|---|---|
| C | mpicc | mpicc | mpiicc |
| C++ | mpicxx | mpicxx | mpicpc |
| F77 | mpif77 | mpif77 | mpiifort |
| F90 | mpif90 | mpif90 | mpiifort |
| F95 | mpif90 | mpif90 | mpiifort |
OpenMPI
To load the Intel MPI wrapper scripts and libraries use:
module load openmpi/intel
To load the GNU MPI wrapper scripts and libraries use:
module load openmpi/gcc
This will also load the related compiler module if it is not already loaded, for instance the Intel Compiler module.
Intel MPI
When you load Intel MPI it will add both the GNU and Intel compilers to your path. The Intel MPI wrapper scripts have different names, whereas the OpenMPI wrapper scripts have identical names and therefore require their own module.
module load intel/64/impi