High Performance Computing

Obliczenia wielkoskalowe mogą być zaimplementowane przy użyciu biblioteki MPI (w tym MPJ Express), a następnie rozpraszane na wielu komputerach (klastry). MPI dostarcza programistom mechanizm komunikacji grupowej: grupowe przesyłanie danych (broadcast, scattering) oraz podstawowe operacje arytmetyczne wykonywane na przesyłanych danych (reduction).

MPJ Collective API

Do operacji grupowych należą następujące metody:
  • MPI.COMM_WORLD.Bcast(buf, offset, count, datatype, root);
  • MPI.COMM_WORLD.Scatter(sendbuf, sendoffset, sendcount, sendtype, recvbuf, recvoffset, recvcount, recvtype, root);
  • MPI.COMM_WORLD.Gather(sendbuf, sendoffset, sendcount, sendtype, recvbuf, recvoffset, recvcount, recvtype, root);
W niektórych sytuacjach przydatna jest również metoda redukcji, która umożliwia dokonywania podstawowych operacji arytmetycznych na redukowanych danych (MPI.SUM; MPI.MIN; MPI.MAX; MPI.PROD;):
  • MPI.COMM_WORLD.Reduce(sendbuf, sendoffset, recvbuf, recvoffset, count, datatype, op, root);

Operacje przesyłania grupowego pokazują poniższe schematy:

collective.gif

Operacje redukcji oraz skanowania:

collop.gif

Zadanie 1

Przetestuj działanie metod scatter rozsyłając n liczb, a nastepnie redukując te n liczb metodą reduce. Jako operator redukcji wybierz kolejno sumę, minimum oraz mnożenie. Parametr n oznacza liczbę procesów. Przykładowy kod dla n=10 procesów:

int[] sendbuf = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] recvbuf = new int[1];
MPI.COMM_WORLD.Scatter(sendbuf, 0, 1, MPI.INT, recvbuf, 0, 1, MPI.INT, 0);
MPI.COMM_WORLD.Reduce(recvbuf, 0, recvbuf, 0, 1, MPI.INT, MPI.SUM, 0);

Zadanie 2

Korzystając z dostępnych metod komunikacji grupowej MPI, zaimplementuj algorytm wyznaczania sumy prefiksów ciągu.

Zadanie 3

HPC: wyznaczanie wartości liczby Pi metodą monte carlo.