Skip to content
Snippets Groups Projects
compilers.md 4.23 KiB
Newer Older
  • Learn to ignore specific revisions
  • David Hrbáč's avatar
    David Hrbáč committed
    # Compilers
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    Available compilers, including GNU, INTEL and UPC compilers
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    There are several compilers for different programming languages available on the cluster:
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    -   C/C++
    -   Fortran 77/90/95/HPF
    -   Unified Parallel C
    -   Java
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    The C/C++ and Fortran compilers are provided by:
    
    Opensource:
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    -   GNU GCC
    -   Clang/LLVM
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    Commercial licenses:
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    -   Intel
    -   PGI
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    David Hrbáč's avatar
    David Hrbáč committed
    ## Intel Compilers
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    For information about the usage of Intel Compilers and other Intel products, please read the [Intel Parallel studio](intel-suite/) page.
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    David Hrbáč's avatar
    David Hrbáč committed
    ## PGI Compilers
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    The Portland Group Cluster Development Kit (PGI CDK) is available.
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        $ module load PGI
        $ pgcc -v
        $ pgc++ -v
        $ pgf77 -v
        $ pgf90 -v
        $ pgf95 -v
        $ pghpf -v
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    The PGI CDK also incudes tools for debugging and profiling.
    
    PGDBG OpenMP/MPI debugger and PGPROF OpenMP/MPI profiler are available
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        $ module load PGI
        $ module load Java
        $ pgdbg &
        $ pgprof &
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    For more information, see the [PGI page](http://www.pgroup.com/products/pgicdk.htm).
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    David Hrbáč's avatar
    David Hrbáč committed
    ## GNU
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    For compatibility reasons there are still available the original (old 4.4.7-11) versions of GNU compilers as part of the OS. These are accessible in the search path by default.
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    It is strongly recommended to use the up to date version which comes with the module GCC:
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        $ module load GCC
        $ gcc -v
        $ g++ -v
        $ gfortran -v
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    With the module loaded two environment variables are predefined. One for maximum optimizations on the cluster's architecture, and the other for debugging purposes:
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        $ echo $OPTFLAGS
        -O3 -march=native
    
        $ echo $DEBUGFLAGS
        -O0 -g
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    For more information about the possibilities of the compilers, please see the man pages.
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    David Hrbáč's avatar
    David Hrbáč committed
    ## Unified Parallel C
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    UPC is supported by two compiler/runtime implementations:
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    -   GNU - SMP/multi-threading support only
    -   Berkley - multi-node support as well as SMP/multi-threading support
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    ### GNU UPC Compiler
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    To use the GNU UPC compiler and run the compiled binaries use the module gupc
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        $ module add gupc
        $ gupc -v
        $ g++ -v
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    Simple program to test the compiler
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
        $ cat count.upc
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        /* hello.upc - a simple UPC example */
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        #include <upc.h>
        #include <stdio.h>
    
        int main() {
    
    David Hrbáč's avatar
    David Hrbáč committed
          if (MYTHREAD == 0) {
            printf("Welcome to GNU UPC!!!n");
          }
          upc_barrier;
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
          printf(" - Hello from thread %in", MYTHREAD);
    
    David Hrbáč's avatar
    David Hrbáč committed
          return 0;
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        }
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    To compile the example use
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        $ gupc -o count.upc.x count.upc
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    To run the example with 5 threads issue
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        $ ./count.upc.x -fupc-threads-5
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    David Hrbáč's avatar
    David Hrbáč committed
    For more information see the man pages.
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    ### Berkley UPC Compiler
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    To use the Berkley UPC compiler and runtime environment to run the binaries use the module bupc
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        $ module add BerkeleyUPC/2.16.2-gompi-2015b
        $ upcc -version
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    As default UPC network the "smp" is used. This is very quick and easy way for testing/debugging, but limited to one node only.
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    For production runs, it is recommended to use the native InfiniBand implementation of UPC network "ibv". For testing/debugging using multiple nodes, the "mpi" UPC network is recommended.
    
    !!! Warning
        Selection of the network is done at the compile time and not at runtime (as expected)!
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    Example UPC code:
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
        $ cat hello.upc
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        /* hello.upc - a simple UPC example */
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        #include <upc.h>
        #include <stdio.h>
    
        int main() {
    
    David Hrbáč's avatar
    David Hrbáč committed
          if (MYTHREAD == 0) {
            printf("Welcome to Berkeley UPC!!!n");
          }
          upc_barrier;
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
          printf(" - Hello from thread %in", MYTHREAD);
    
    David Hrbáč's avatar
    David Hrbáč committed
          return 0;
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        }
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    To compile the example with the "ibv" UPC network use
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
        $ upcc -network=ibv -o hello.upc.x hello.upc
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    To run the example with 5 threads issue
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        $ upcrun -n 5 ./hello.upc.x
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    To run the example on two compute nodes using all 48 cores, with 48 threads, issue
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
        $ qsub -I -q qprod -A PROJECT_ID -l select=2:ncpus=24
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        $ module add bupc
        $ upcrun -n 48 ./hello.upc.x
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    David Hrbáč's avatar
    David Hrbáč committed
    For more information see the man pages.
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    For information how to use Java (runtime and/or compiler), please read the [Java page](java/).
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    David Hrbáč's avatar
    David Hrbáč committed
    For information how to work with NVIDIA CUDA, please read the [NVIDIA CUDA page](../../anselm-cluster-documentation/software/nvidia-cuda/).