Compilers:Frontenac

From CAC Wiki
Jump to: navigation, search

Note: This pertains to the Frontenac system which is currently being built. Our users are gradually moved to it. You can only access this system if access has been activated. We will contact you when this has happened. If you are interested in migrating ahead of schedule, please contact us at cac.help@queensu.ca

Compilers at the Centre for Advanced Computing (Frontenac Cluster)

This is an introduction to the Fortran, C, and C++ compilers used on our Frontenac Compute Cluster. It is meant to give the user a basic idea about the usage of the compilers and about code optimization options. It cannot replace the documentation of the individual compilers.

Available Compilers

We are currently supporting two types Compiler Suites on the Frontenac Linux cluster :

  • The Intel Compiler Suite. Multiple versions are available. The compilers are called ifort for Fortran and icc for C/C++.
  • As part of the CentOS distribution, we also have the Gnu C/C++ and Fortran Compilers called gcc, g++ and gfortran, respectively. Multiple versions are accessible through the "module" command.

Setup

  • For setting up the Intel Compiler Suite you need to issue the command
    module load intel
    . This defaults to the 2017.1 version of the compiler suite. An older version (2016.4) is available by specifying the version number
    module load intel/2016.4
  • The public-domain compilers "gcc" and "gfortran" are available by default, i.e. they require no set-up. The current version for the default StdEnv/2020 is 9.3.0. Older versions can be accessed through version specification
    module load gcc/4.8.3
    . These compilers are often required when compiling public-domain programs. We recommend the use of these compilers unless Intel is required to improve performance.

Compiling and Linking

  • The Intel compilers are called ifort and icc for Fortran (all versions) and C/C++, respectively.
  • The public-domain gnu compilers are called gcc, g++, and gfortran for C, C++, and Fortran (all versions), respectively.
Compilation commands
Fortran C C++ Activation
Intel ifort icc module load intel
Gnu gfortran gcc g++ module load gcc

Compiling and linking is best done with a makefile. Here are a few common flags. Consult man pages for specific details (for instance "man gcc").

Compiling

compiler -c [options] name.ext

where "compiler" stands for the compiler name, for instance "gfortran" for the GNU Fortran compiler. The file extension "ext" determines what source code is being compiled, for instance "f" means "fixed format" Fortran, f90 means "free format" Fortran (90), or "c" stands for C. "[options]" denotes additional compiler flags that usually start with a '-'.

Linking

compiler -o name [options] [libraries] list

"compiler" see above. "name" is the name of the executable (if not specified, the default is "a.out". [options] see above. [libraries] is a list of libraries that need to be linked in, usually as a list of file names with full path, or as '-L' and '-l' combinations [see below]. "list" means a list of object files, usually with ".o" extension.

Using the compilers and the linker in the above manner requires the proper setting of the PATH environment variable, i.e. prior set-up.

Options / flags

There are hundreds of compiler flags, and many of them are not required most of the time. A few that are in more frequent use are:

  • -On optimizes your code. "n" is a number from 1 to 5 with increasing severity of alterations made to the code, but also increasing gain. Up to -xO3 is generally rather safe to use. But you should, of course, always check results against an un-optimized version: they might differ.
  • -g produces code that can be debugged. -g and -On are not necessarily mutually exclusive, but optimization may make debugging difficult, because it alters the relationship between source code and executable. This is a good flag to have in the development stage of a program, but is usually dropped later.
  • -V (or -v) produces the version of the compiler.
  • -lname is used to bind in a library called libname.a (static) or libname.so (dynamic). This flag is used to link only.
  • -L dirname is used in conjunction with -lname and lets the linker know where to look for libraries. "dirname" is a directory name such as /opt/studio12/SUNWspro/prod/lib.
  • -Rdirname is used to tell the program where to get dynamic libraries at runtime.

There are many more flags. They are documented in the man pages (e.g. "man ifort" for the Intel Fortran compiler), as well in the documentation for the compiler. Some compiler flags are only useful for parallel programs and will be discussed later.

Documentation

The best way to get a quick list of compiler options is to use the "man pages". Just type "man compiler" where "compiler" stands for the name of the compiler you want to use, and get a long explanation of all the relevant options. This is not very user-friendly, but great for a quick look-up.

Help

  • If you have questions that you can't resolve by checking documentation, send email to cac.help@queensu.ca
  • If you want to start a larger project that involves making code executable on parallel machines, you may want to do this even before you start and we can point you in the right direction.