Introduction to PGAS Languages
Introduction
Partitioned Global Address Space Languages (PGAS) provide a parallel programming model based on the assumption that the global memory adress space is logically partitioned with a portion of the memory being assigned to a specific processor. Two common PGAS languages are Unified Parallel C (UPC) and Co-array Fortran (CAF). The first implementation of this tutorial is based on UPC and CAF.
This tutorial assumes that you have some familiarity with UNIX, text editors and compiling programs from source code. It contains some material from the SC11 Tutorial, Intro to PGAS (UPC and CAF) and Hybrid for Multicore Programming, by Alice Koniges (LBL-NERSC), Katherine Yelick (LBL-NERSC), Rolf Rabenseifner (HLRS), Reinhold Bader(Leibniz Supercomputer Centre), and David Eder (LLNL). Eventually, more material from the tutorial will be available on this site.
This tutorial is specific to NERSC, however the codes should be portable. For example, the Berkeley UPC web pages provide examples as well as compilers.
Use these first programs to test your environment and get started. These experiments may be run on the NERSC Hopper machine. There are currently two suggested environments for running these exercises. Recall that one uses the "module load" commands on NERSC systems to set up links to compilers, etc. For UPC, you may use either Berkeley UPC or the Cray compilers. The Cray compilers support both UPC and CAF. For small examples it is convenient to set up interactive batch jobs. To do this, follow the instructions below.
qsub -I -q interactive -lmppwidth=24,mppnppn=24,walltime=00:20:00 -V
Then wait for a new shell.
Using Berkeley UPC
module load bupc
Go to previous working directory if in a newly started PBS shell:
cd $PBS_O_WORKDIR
Compilation:
upcc -O -o myprog myprog.c
Parallel Execution (requires a PBS shell):
upcrun -n 1 -cpus-per-node 24 ./myprog
upcrun -n 2 -cpus-per-node 24 ./myprog
upcrun -n 4 -cpus-per-node 24 ./myprog
Using Cray Compilers
module switch PrgEnv-pgi PrgEnv-cray
Go to previous working directory if in a newly started PBS shell:
cd $PBS_O_WORKDIR
UPC Compilation:
cc -h upc -o myprog myprog.c
or CAF compilation:
ftn -e m -h caf -o myprog myprog.f90
Parallel Execution (requires a PBS shell):
aprun -n 1 -N 1 ./myprog
aprun -n 2 -N 2 ./myprog
aprun -n 4 -N 4 ./myprog
CAF Hello
hello_caf_1.f90
program hello
implicit none
integer :: myrank, numprocs
myrank = this_image()
numprocs = num_images()
if (myrank == 1) print *, 'Hello world'
print *, 'I am image number',myrank,' of ',numprocs
end program hello
UPC Hello
hello_upc_1.c
#include <stdio.h>
#include <upc.h>
int main(int argc, char** argv)
{
if (MYTHREAD == 0) printf("hello world\n");
printf("I am thread number %d of %d threads\n", MYTHREAD, THREADS);
return 0;
}