Compiling Code on ALICE and SPECTRE
The default compiler on the HPC systems is the GNU Compiler Collection, version 4.8.5. This is the compiler which will be available immediately on logging in and is used to compile the libraries that are available on the system.
Newer versions of gcc can be loaded via the module system. You should only use these if there are specific features of the newer compiler you need and you cannot use the intel compilers.
To use the latest Intel compilers, enter:
module load intel/compilers
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:
|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.
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|
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.
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/impi