User Tools

Site Tools


howto:compiling_tips_n_tricks

Compiling Tips and Tricks

A technique is what you call any trick you use more than once.

Compilers

The three dominant compiled languages used in HPC are C, Fortran and C++.

Many people write the first and last as C/C++. That's misleading. C and C++ are separate languages. Confusing them is responsible for many problems.

The compilers found at the CHPC fall into three families: GCC, Intel and Sun Studio.

'GCC' stands for GNU Compiler Collection; 'gcc' stands for GNU C Compiler; try not to confuse them 8-)
There's a fourth family, IBM XL, but we won't worry about it since the P690s are gone and BG/P is in hibernation.

Table of Compilers and their Command Names

Language GCC Intel
C gcc icc
Fortran gfortran ifort
C++ g++ icpc

So to actually compile a C program with the GNU C compiler you would type at the shell command line:

gcc -o hello hello.c

And for a Fortran 90 program using Intel's compiler:

ifort -o hello hello.f90

Table of Compiler Variables

By convention, there are variables that define the actual command invoked (see above) and which can be used in the shell, with make files and configure.

Variable Compiler Example
CC C CC=gcc
FC Fortran FC=ifort
CXX C++ CXX=/opt/gridware/intel/comp12/composerxe-2011.0.084/bin/intel64/icpc
The last example shows that you can include the full path to a specific compiler command — usually the current PATH will be searched.

Fortran comes in two main flavours, Fortran 77 and Fortran 90 (also called 9x since it includes Fortran 95). By default FC refers to the Fortran 9x compiler and when it is necessary to also point to a Fortran 77 compiler:

F77 Fortran 77 F77=g77

Example

When building an MPI library — for example, OpenMPI — one should set all four variables since MPI provides MPI compilers for:

mpicc MPI C compiler
mpicxx MPI C++ compiler
mpif77 MPI Fortran 77 compiler
mpif90 MPI Fortran 90 compiler

When building OpenMPI then, before the usual make; make install command, tell configure which compilers to use:

./configure --prefix=$HOME/mpi/intel/ \ 
CC=icc CXX=icpc F77=ifort FC=ifort \
--with-openib \ 
--with-openib-libdir=/usr/lib64/
The above example uses Intel compilers and also builds in InfiniBand support.

Which Compilers am I Using?

That's a very good question.

Table of Compiler Commands for Version

Language GCC Intel
C gcc --version icc -v
Fortran gfortran --version ifort -v
C++ g++ --version icpc -v

The -v options stands for 'verbose' and it produces additional messages when used with any compiler command. For the Intel compilers, -v by itself just produces the version:

login01:~$ icc -v
Version 12.0.0

For the GCC compilers, -v produces a lot more information:

login01:~$ gfortran -v
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info 
--enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib 
--enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-
languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi 
--disable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic 
--host=x86_64-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-52)

Which is why GCC compilers provide the long option --version to just obtain the version:

login01:~$ gfortran --version
GNU Fortran (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52)
Copyright (C) 2007 Free Software Foundation, Inc.

GNU Fortran comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of GNU Fortran
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING
You also get a copyright message but the version is in the first line.
login01:~$ gfortran --version | head -1
GNU Fortran (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52)

Using a different, newer, version of GCC is easy through the use of GNU modules:

login01:~$ module load gcc
login01:~$ gfortran --version | head -1
GNU Fortran (GCC) 4.7.2
/var/www/wiki/data/pages/howto/compiling_tips_n_tricks.txt · Last modified: 2013/07/25 11:42 by kevin