Skip to content
Snippets Groups Projects
Forked from SCS / docs.it4i.cz
1533 commits behind, 41 commits ahead of the upstream repository.

GPI-2

A library that implements the GASPI specification

Introduction

Programming Next Generation Supercomputers: GPI-2 is an API library for asynchronous interprocess, cross-node communication. It provides a flexible, scalable and fault tolerant interface for parallel applications.

The GPI-2 library (www.gpi-site.com/gpi2/) implements the GASPI specification (Global Address Space Programming Interface, www.gaspi.de).

GASPI is a Partitioned Global Address Space (PGAS) API. It aims at scalable, flexible and failure tolerant computing in massively parallel environments.

Modules

The GPI-2, version 1.0.2 is available on Anselm via module gpi2:

$ module load gpi2

The module sets up environment variables, required for linking and running GPI-2 enabled applications. This particular command loads the default module, which is gpi2/1.0.2

Linking

Link with -lGPI2 -libverbs

Load the gpi2 module. Link using -lGPI2 and **** -libverbs switches to link your code against GPI-2. The GPI-2 requires the OFED infinband communication library ibverbs.

Compiling and linking with Intel compilers

$ module load intel $ module load gpi2 $ icc myprog.c -o myprog.x -Wl,-rpath=$LIBRARY_PATH -lGPI2 -libverbs

Compiling and linking with GNU compilers

$ module load gcc $ module load gpi2 $ gcc myprog.c -o myprog.x -Wl,-rpath=$LIBRARY_PATH -lGPI2 -libverbs

Running the GPI-2 codes

gaspi_run

gaspi_run starts the GPI-2 application

The gaspi_run utility is used to start and run GPI-2 applications:

$ gaspi_run -m machinefile ./myprog.x

A machine file (machinefile) with the hostnames of nodes where the application will run, must be provided. The**** machinefile lists all nodes on which to run, one entry per node per process. This file may be hand created or obtained from standard $PBS_NODEFILE:

$ cut -f1 -d"." $PBS_NODEFILE > machinefile

machinefile:

cn79 cn80

This machinefile will run 2 GPI-2 processes, one on node cn79 other on node cn80.

machinefle:

cn79 cn79 cn80 cn80

This machinefile will run 4 GPI-2 processes, 2 on node cn79 o 2 on node cn80.

Use the mpiprocs to control how many GPI-2 processes will run per node

Example:

$ qsub -A OPEN-0-0 -q qexp -l select=2:ncpus=16:mpiprocs=16 -I

This example will produce $PBS_NODEFILE with 16 entries per node.

gaspi_logger

gaspi_logger views the output form GPI-2 application ranks

The gaspi_logger utility is used to view the output from all nodes except the master node (rank 0). The gaspi_logger is started, on another session, on the master node - the node where the gaspi_run is executed. The output of the application, when called with gaspi_printf(), will be redirected to the gaspi_logger. Other I/O routines (e.g. printf) will not.

Example

Following is an example GPI-2 enabled code:

#include <GASPI.h> #include <stdlib.h>

void success_or_exit ( const char* file, const int line, const int ec) { if (ec != GASPI_SUCCESS) { gaspi_printf ("Assertion failed in %s[%i]:%dn", file, line, ec); exit (1); } }

#define ASSERT(ec) success_or_exit (FILE, LINE, ec);

int main(int argc, char *argv[]) { gaspi_rank_t rank, num; gaspi_return_t ret;

/* Initialize GPI-2 */
ASSERT( gaspi_proc_init(GASPI_BLOCK) );

/* Get ranks information */
ASSERT( gaspi_proc_rank(&rank) );
ASSERT( gaspi_proc_num(&num) );

gaspi_printf("Hello from rank %d of %dn",
         rank, num);

/* Terminate */
ASSERT( gaspi_proc_term(GASPI_BLOCK) );

return 0;

}

Load modules and compile:

$ module load gcc gpi2 $ gcc helloworld_gpi.c -o helloworld_gpi.x -Wl,-rpath=$LIBRARY_PATH -lGPI2 -libverbs

Submit the job and run the GPI-2 application

$ qsub -q qexp -l select=2:ncpus=1:mpiprocs=1,place=scatter,walltime=00:05:00 -I qsub: waiting for job 171247.dm2 to start qsub: job 171247.dm2 ready

cn79 $ module load gpi2 cn79 $ cut -f1 -d"." $PBS_NODEFILE > machinefile cn79 $ gaspi_run -m machinefile ./helloworld_gpi.x Hello from rank 0 of 2

At the same time, in another session, you may start the gaspi logger:

$ ssh cn79 cn79 $ gaspi_logger GASPI Logger (v1.1) [cn80:0] Hello from rank 1 of 2

In this example, we compile the helloworld_gpi.c code using the gnu compiler (gcc) and link it to the GPI-2 and ibverbs library. The library search path is compiled in. For execution, we use the qexp queue, 2 nodes 1 core each. The GPI module must be loaded on the master compute node (in this example the cn79), gaspi_logger is used from different session to view the output of the second process.