, , MPI. , :
. main ( ):
MPI_Init(&argc, &argv);
, main . MPI- mpirun , MPI_Init.
. , , MPI:
MPI_Abort( , MPI);
MPI_Abort , . MPI_COMM_WORLD, ( ) , , -, . MPI_ERR_OTHER, , MPI.
:
MPI_Finalize();
, :
ü exit;
ü MPI_Init return main;
ü main void, return, MPI_Finalize() main.
: ( , ) :
int size, rank;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
pi_mpi.c . , , MPI_Bcast MPI_Reduce. : MPI_Bcast ; MPI_Reduce ).
2.4. "-"
: , - . MPI , , :
1 :
int buf[10];
MPI_Send(buf, 5, MPI_INT, 1, 0, MPI_COMM_WORLD);
2 :
int buf[10];
MPI_Status status;
MPI_Recv(buf, 10, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
:
1. , 1 , 2 . , , , , , , , .
2. . , . MPI_Send , ( 5 ). MPI_Recv . - , - .
|
|
3. . MPI_Send MPI_Recv . MPI MPI_INT, MPI_CHAR, MPI_DOUBLE , MPI_Datatype. "MPI_" (int, char, double,...), . "" MPI , , , MPI .
4. , . MPI 0 ( -1). 0 1, 1 0.
5. . 0 32767, . , , , - -:
ü ;
ü , , . "#define" "const int".
6. (). MPI_Send MPI_Recv.
7. . : , -, .
2.5. : MPI_Sendrecv
- . ( ):
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if(rank % 2) {
/*
* ,
*
*/
MPI_Send(..., (rank+1) % size,...);
MPI_Recv(..., (rank+size-1) % size,...);
} else {
/* :
* ,
* .
*/
MPI_Recv(..., (rank-1) % size,...);
MPI_Send(..., (rank+1) % size,...);
}
:
MPI_Send(..., anyRank,...); /* */
MPI_Recv(..., anyRank,...); /* */
, MPI , . - MPI_Sendrecv. 12 : 5 , MPI_Send, 7 , MPI_Recv. , IF-ELSE . , :
ü , ;
ü MPI_Sendrecv ; , "";
|
|
ü MPI_Sendrecv MPI_Send MPI_Recv, . "" .
MPI_Sendrecv_replace - . , count : , . :
ü ;
ü ;
ü .
MPI_Sendrecv_replace .
(deadlock, ) , , . :
-- 1 -- -- 2 --
Recv( 2) Recv( 1)
Send( 2) Send( 1)
: , ; ; ... SIG_KILL.
"" MPI :
ü ;
ü , ;
ü .
(). , - , ( , ). : , ; .
, / / , .