Parallellprogrammering

PC-ene på studentdatasalene har installert programvare som gjør det mulig å kjøre parallelle beregninger (ved hjelp av OpenMPI) som om alle PC-ene var en stor superdatamaskin. Ytelsen kan nok ikke måle seg med NTNU sin egen superdatamaskin vilje, men for enkelte formål kan det likevel være bra nok.

Kildekoden som kjøres på vår dataklynge kan være identisk med den som kjøres på en superdatamaskin som igjen betyr at vår klynge kan brukes til utvikling og testing av programmer som senere skal løse større problemer.

Å bruke dataklyngene våre er helt gratis så lenge du har konto på datasalen.

Hvor kan jeg kjøre jobber?

Du kan bruke MPI på følgende datamaskiner:

  • markov.math.ntnu.no (beregningsserveren vår)
  • Banach-klyngen (banach01.math.ntnu.no - banach26.math.ntnu.no)
  • Null-klyngen (null01.math.ntnu.no - null26.math.ntnu.no)

Vi har også en oversikt over hvilken hardware disse maskinene har.

Hvordan kompilerer jeg programmet mitt?

For å kompilere programmet ditt for parallelle beregninger kan du bruke følgende kompilatorer til følgende språk

Språk Kompilator
c mpicc
c++ mpic++
Fortran77 mpif77
Fortran90 mpif90

Kompilatorne brukes på samme måte som gcc/g++, for å kompilere C-filen simulering.c kjører du:

 mpicc -o simulering simulering.c

Hvordan velger jeg hvilke maskiner jeg vil bruke?

For å fortelle hvilke datamaskiner du ønsker å kjøre programmet ditt på må du opprette ei host-fil. Denne filen inneholder navn/adresse til de PC-ene du ønsker å kjøre programmet ditt på samt hvor mange kjerner du vil bruke. Ei hostfil kan for eksempel se slik ut:

# Dette er hostfilen min
null01.math.ntnu.no slots=3
null05.math.ntnu.no slots=2

Denne hostfilen vil bruke tre kjerner på null01 og to kjerner på null05. Hostfilen kan for eksempel ligge i samme mappe som programmet ditt for enkel tilgang.

Predefinerte hostfiler

Vi har laget egne hostfiler for å kjøre et program på enten banachrommet eller nullrommet, eller begge to samtidig:

Filnavn Antall kjerner
/global/etc/banachcluster 26*2 kjerner
/global/etc/nullcluster 26*2 kjerner
/global/etc/salcluster 52*2 kjerner

Maskinene må være på

For at hostfilen skal virke, må alle maskinene som er nevnt i filen være påskrudd. Av og til er en eller flere av maskinene i ustand eller avskrudd, da må maskinen fjernes fra hostfilen for at kjøringen skal gå bra. En oversikt over hvilke maskiner som er tilgjengelige akkurat nå kan du finne på http://www.stud.math.ntnu.no/salstatus/

Hvordan kjører jeg programmet mitt?

Logg først inn på Markov med kommandoen ssh markov.math.ntnu.no. Selv om du skal bruke Null- eller Banach-clusteret bør du starte beregningene dine fra Markov.

Når du har kompilert programmet ditt samt opprettet ei hostfil kjører du programmet ditt ved å bruke følgende kommando:

mpirun -hostfile min_hostfil ./mitt_program

Programmet mitt_program vil nå starte på kjernene spesifisert i min_hostfil.

Hvis du vil bruke den ferdiglagde hostfilen for å kjøre programmet på nullklyngen, bruker du kommandoen:

mpirun -hostfile /global/etc/nullcluster ./mitt_program

Hvis du har vært innlogget veldig lenge (>10 timer), kan det hende at du må kjøre kommandoen

kinit

før du starter beregningen. Symptomene for at dette trengs er hvis beregningen ikke starter som den skal men blir hengende.

Av samme årsak vil beregninger som kjører mer enn 10 timer på Null- og Banach-clusteret, stanse. Beregninger som kun kjører på Markov (og ikkke på salmaskinene) har ikke denne begrensningen.

Hvor kan jeg lære mer?

Hver høst holdes det et fag i parallellprogrammering kalt innføring i bruk av superdatamaskiner. Ellers kan de to linkene under være av interesse.

Det holdes også et introduksjonskurs i parallellprogrammering en gang på starten av hvert semester som er gratis for alle ntnu-studenter og ansatte. For mer info kan du se på hjemmesidene til kurset.

Eksempler

Dette er et standardeksempel for å vise hvordan parallelle programmer ser ut.

#include "mpi.h"
#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv)
{
  int rank, size;

  nice(30);

  MPI_Init( &argc, &argv );
  MPI_Comm_rank(MPI_COMM_WORLD, &rank );
  MPI_Comm_size(MPI_COMM_WORLD, &size );
  printf("Jeg er prosessor nr. %d av totalt %d prosessorer!\n", rank, size);
  MPI_Finalize();
  return 0;
}

Kompiler programmet ditt på følgende måte

mpicc -o mpi-test mpi-test.c

Om du kjører programmet ditt på ti prosessorer vil du få følgende output:

mpirun -hostfile min_hostfil ./mpi-test
Jeg er prosessor nr. 2 av totalt 10 prosessorer!
Jeg er prosessor nr. 5 av totalt 10 prosessorer!
Jeg er prosessor nr. 9 av totalt 10 prosessorer!
Jeg er prosessor nr. 0 av totalt 10 prosessorer!
Jeg er prosessor nr. 3 av totalt 10 prosessorer!
Jeg er prosessor nr. 4 av totalt 10 prosessorer!
Jeg er prosessor nr. 8 av totalt 10 prosessorer!
Jeg er prosessor nr. 1 av totalt 10 prosessorer!
Jeg er prosessor nr. 7 av totalt 10 prosessorer!
Jeg er prosessor nr. 6 av totalt 10 prosessorer!

Merk at rekkefølgen på prosessorene er tilfeldig. Du vil nok få en litt annen rekkefølge en den som er vist her.

2016-04-21, Per Kristian Hove