When you compile your code for our XC40 systems, you are normally cross-compiling for the compute nodes (Intel Xeon Phi 2nd Generation [KNL]), rather than directly compiling for the login nodes (non-KNL). By default, you are using the Intel compiler suite. We also provide the Cray, GNU, and Clang compiler suites via modules.
Wrapper Command Names
Regardless of which compiler suite you use, you must use the standard Cray compiler wrapper names, which will automatically include MPI and other dependencies:
- cc – for C codes
- CC – for C++ codes
- ftn – for Fortran codes
Do not use the mpicc, mpiCC or mpicc++, or mpif77 or mpif90 wrappers. They exist on the XC40 and are callable, but will not produce code for the compute nodes.
The following are examples to compile and link a hello.c C-source program, hello.cpp C++ source program, and hello.f Fortran source program into an executable hello:
cc -g -O -o hello hello.c CC -g -O -o hello hello.cpp ftn -g -O -o hello hello.f
You should always include the -g option regardless of the optimization level. It does not impact performance and allows tools to map to your source code to provide call stacks, etc.
Note: In order to use C++14 Standard Library on Theta use module load gcc.This will put the most recent version of GCC and C++ libraries on the working path.
Generally, you should use the compiler wrappers to invoke the linker indirectly, when linking object files.
To dynamically link executables, pass `-dynamic` to the compiler wrappers or set the environment variable
There are man pages for the wrappers:
man cc man CC man ftn
which explain how options to specific underlying compiler suites, such as Intel, are passed through. For detailed man pages about the specific compiler suites, you must specify the names of the specific compilers:
man icc (C++/C) man ifort
man craycc man crayCC man crayftn
man gcc man g++ man gfortran
LLVM/Clang (Fortan not yet available)
clang --help clang++ --help
Switching Compiler Suites
Use modules to select different compiler suites. To change from the default Intel suite to one of the three others available, use one of these commands:
module swap PrgEnv-intel PrgEnv-cray module swap PrgEnv-intel PrgEnv-gnu module swap PrgEnv-intel PrgEnv-llvm
Compiling for Login Nodes
The login nodes are not for computing. If you need to build a tool or utility to run on the login nodes, you should directly invoke the compilers in whichever suite you are using.