Szukaj…


Uwagi

MPI to standard komunikacji między grupą rozproszonych (lub lokalnych) procesów. Obejmuje procedury wysyłania i odbierania danych, komunikacji zbiorowej oraz inne bardziej złożone zadania.

Standard zapewnia API dla C i Fortran, ale istnieją również powiązania z różnymi innymi językami.

Wersje

Wersja Standard Data wydania
1 mpi-report-1.3-2008-05-30.pdf 1994-05-05
2.0 mpi2-report.pdf 2003-09-15
2.2 mpi22-report.pdf 2009-09-04
3.0 mpi30-report.pdf 21.09.2012
3.1 mpi31-report.pdf 2015-06-04

Ranga i rozmiar

Aby uzyskać rozmiar komunikatora (np. MPI_COMM_WORLD ) i pozycję w nim procesu lokalnego:

int rank, size;
int res;
MPI_Comm communicator = MPI_COMM_WORLD;

res = MPI_Comm_rank (communicator, &rank);
if (res != MPI_SUCCESS)
{
  fprintf (stderr, "MPI_Comm_rank failed\n");
  exit (0);
}
res = MPI_Comm_size (communicator, &size);
if (res != MPI_SUCCESS)
{
  fprintf (stderr, "MPI_Comm_size failed\n");
  exit (0);
}

Init / Finalize

Przed uruchomieniem komend MPI środowisko musi zostać zainicjowane i sfinalizowane:

int main(int argc, char** argv)
{
    int res;
    res = MPI_Init(&argc,&argv);
    if (res != MPI_SUCCESS)
    {
      fprintf (stderr, "MPI_Init failed\n");
      exit (0);
    }
    ...
    res = MPI_Finalize();
    if (res != MPI_SUCCESS)
    {
      fprintf (stderr, "MPI_Finalize failed\n");
      exit (0);
    }
}

Witaj świecie!

Trzy rzeczy są zwykle ważne, gdy zaczynasz uczyć się obsługi MPI. Po pierwsze, musisz zainicjować bibliotekę, gdy będziesz gotowy do jej użycia (musisz też ją sfinalizować, gdy skończysz). Po drugie, będziesz chciał poznać rozmiar swojego komunikatora (rzecz, której używasz do wysyłania wiadomości do innych procesów). Po trzecie, będziesz chciał poznać swoją pozycję w tym komunikatorze (jaki numer procesu masz w tym komunikatorze).

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

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

    res = MPI_Init(&argc, &argv);
    if (res != MPI_SUCCESS)
    {
        fprintf (stderr, "MPI_Init failed\n");
        exit (0);
    }

    res = MPI_Comm_size(MPI_COMM_WORLD, &size);
    if (res != MPI_SUCCESS)
    {
        fprintf (stderr, "MPI_Comm_size failed\n");
        exit (0);
    }
    res = MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    if (res != MPI_SUCCESS)
    {
        fprintf (stderr, "MPI_Comm_rank failed\n");
        exit (0);
    }

    fprintf(stdout, "Hello World from rank %d of %d~\n", rank, size);

    res = MPI_Finalize();
    if (res != MPI_SUCCESS)
    {
        fprintf (stderr, "MPI_Finalize failed\n");
        exit (0);
    }
}

Jeśli uruchomisz ten program w ten sposób:

mpiexec -n 2 ./hello

Oczekuje się, że uzyskasz wynik w ten sposób:

Hello World from rank 0 of 2!
Hello World from rank 1 of 2!

Możesz również pobrać dane wyjściowe wstecz (zobacz http://stackoverflow.com/a/17571699/491687 ), aby uzyskać więcej informacji na ten temat:

Hello World from rank 1 of 2!
Hello World from rank 0 of 2!

Zwraca wartości wywołań MPI

Prawie każde wywołanie MPI zwraca całkowity kod błędu, który oznacza powodzenie operacji. Jeśli nie wystąpi błąd, kod powrotu to MPI_SUCCESS :

if (MPI_Some_op(...) != MPI_SUCCESS)
{
   // Process error
}

Jeśli wystąpi błąd, MPI wywołuje procedurę obsługi błędów związaną z komunikatorem, oknem lub obiektem pliku przed powrotem do kodu użytkownika. Istnieją dwie predefiniowane procedury obsługi błędów (użytkownik może zdefiniować dodatkowe procedury obsługi błędów):

  • MPI_ERRORS_ARE_FATAL - błędy powodują zakończenie programu MPI
  • MPI_ERRORS_RETURN - błędy powodują przekazanie kodu błędu do użytkownika

Domyślna procedura obsługi błędów dla komunikatorów i systemu Windows to MPI_ERRORS_ARE_FATAL ; dla obiektów MPI_ERRORS_RETURN jest to MPI_ERRORS_RETURN . Procedura obsługi błędów dla MPI_COMM_WORLD ma również zastosowanie do wszystkich operacji, które nie są konkretnie powiązane z obiektem (np. MPI_Get_count ). Dlatego sprawdzanie wartości zwracanej operacji innych niż operacje we / wy bez ustawiania procedury obsługi błędów na MPI_ERRORS_RETURN jest zbędne, ponieważ błędne wywołania MPI nie będą zwracane.

// The execution will not reach past the following line in case of error
int res = MPI_Comm_size(MPI_COMM_WORLD, &size);
if (res != MPI_SUCCESS)
{
    // The following code will never get executed
    fprintf(stderr, "MPI_Comm_size failed: %d\n", res);
    exit(EXIT_FAILURE);
}

Aby włączyć przetwarzanie błędów przez użytkownika, należy najpierw zmienić MPI_COMM_WORLD obsługi błędów MPI_COMM_WORLD :

MPI_Comm_set_errhandler(MPI_COMM_WORLD, MPI_ERRORS_RETURN);

int res = MPI_Comm_size(MPI_COMM_WORLD, &size);
if (res != MPI_SUCCESS)
{
    fprintf(stderr, "MPI_Comm_size failed: %d\n", res);
    exit(EXIT_FAILURE);
}

Standard MPI nie wymaga, aby implementacje MPI były w stanie odzyskać się po błędach i kontynuować wykonywanie programu.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow