Sök…


Anmärkningar

MPI är en standard för kommunikation mellan en grupp distribuerade (eller lokala) processer. Den innehåller rutiner för att skicka och ta emot data, kommunicera kollektivt och andra mer komplexa uppgifter.

Standarden tillhandahåller ett API för C och Fortran, men det finns också bindningar till olika andra språk.

versioner

Version Standard Utgivningsdatum
1 mpi-rapport-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 2012-09-21
3,1 mpi31-report.pdf 2015/06/04

Rang och storlek

För att få storleken på en kommunikatör (t.ex. MPI_COMM_WORLD ) och den lokala processen 'ranka inuti den:

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 / Avsluta

Innan några MPI-kommandon kan köras måste miljön initieras och slutföras i slutändan:

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);
    }
}

Hej världen!

Tre saker är vanligtvis viktiga när man börjar lära sig att använda MPI. Först måste du initialisera biblioteket när du är redo att använda det (du måste också slutföra det när du är klar). För det andra vill du veta storleken på din kommunikatör (det du använder för att skicka meddelanden till andra processer). För det tredje vill du veta din rang inom kommunikatören (vilket processnummer är du inom den kommunikatören).

#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);
    }
}

Om du kör det här programmet så här:

mpiexec -n 2 ./hello

Du kan förvänta dig att få output så här:

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

Du kan också få den utmatningen bakåt (se http://stackoverflow.com/a/17571699/491687 ) för mer diskussion om detta:

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

Returnera värden för MPI-samtal

Nästan varje MPI-samtal returnerar en helfelkod, vilket betyder att åtgärden lyckas. Om inget fel uppstår är MPI_SUCCESS :

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

Om ett fel uppstår ringar MPI en felhanterare som är associerad med communicatorn, fönstret eller filobjektet innan den återgår till användarkoden. Det finns två fördefinierade felhanterare (användaren kan definiera ytterligare felhanterare):

  • MPI_ERRORS_ARE_FATAL - fel leder till att MPI-programmet avslutas
  • MPI_ERRORS_RETURN - fel resulterar i att felkoden skickas tillbaka till användaren

Standardfelhanteraren för kommunikatörer och windows är MPI_ERRORS_ARE_FATAL ; för MPI_ERRORS_RETURN är det MPI_ERRORS_RETURN . MPI_COMM_WORLD för MPI_COMM_WORLD gäller också för alla operationer som inte är specifikt relaterade till ett objekt (t.ex. MPI_Get_count ). Således är det överflödigt att kontrollera returvärdet för icke-I / O-operationer utan att ställa in felhanteraren till MPI_ERRORS_RETURN eftersom felaktiga MPI-samtal inte kommer tillbaka.

// 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);
}

För att möjliggöra bearbetning av användarfel måste man först ändra felhanteraren för 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);
}

MPI-standarden kräver inte att MPI-implementationer kan återhämta sig från fel och fortsätta programutförandet.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow