- Convert MPI_Init(NULL, NULL) to MPI_Init(&argc, &argv) because
apparently some people are using these examples to test other MPI's, and some of those MPI's don't handle MPI_Init(NULL, NULL) properly. :-) - Add comments and a print statement to the f90 example to make it like the others. This commit was SVN r11123.
Этот коммит содержится в:
родитель
59844f2119
Коммит
13dd02a9f4
@ -14,7 +14,7 @@ int main(int argc, char* argv[])
|
|||||||
{
|
{
|
||||||
int rank, size;
|
int rank, size;
|
||||||
|
|
||||||
MPI_Init(NULL, NULL);
|
MPI_Init(&argc, &argv);
|
||||||
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
|
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
|
||||||
MPI_Comm_size(MPI_COMM_WORLD, &size);
|
MPI_Comm_size(MPI_COMM_WORLD, &size);
|
||||||
printf("Hello, world, I am %d of %d\n", rank, size);
|
printf("Hello, world, I am %d of %d\n", rank, size);
|
||||||
|
@ -16,7 +16,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
/* Start up MPI */
|
/* Start up MPI */
|
||||||
|
|
||||||
MPI_Init(NULL, NULL);
|
MPI_Init(&argc, &argv);
|
||||||
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
|
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
|
||||||
MPI_Comm_size(MPI_COMM_WORLD, &size);
|
MPI_Comm_size(MPI_COMM_WORLD, &size);
|
||||||
|
|
||||||
|
@ -11,21 +11,36 @@ program ring
|
|||||||
implicit none
|
implicit none
|
||||||
integer :: rank, size, tag, next, from, message, ierr
|
integer :: rank, size, tag, next, from, message, ierr
|
||||||
|
|
||||||
|
! Start up MPI
|
||||||
|
|
||||||
call MPI_INIT(ierr)
|
call MPI_INIT(ierr)
|
||||||
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
|
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
|
||||||
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)
|
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)
|
||||||
|
|
||||||
|
! Calculate the rank of the next process in the ring. Use the modulus
|
||||||
|
! operator so that the last process "wraps around" to rank zero.
|
||||||
|
|
||||||
tag = 201
|
tag = 201
|
||||||
next = mod((rank + 1), size)
|
next = mod((rank + 1), size)
|
||||||
from = mod((rank + size - 1), size)
|
from = mod((rank + size - 1), size)
|
||||||
|
|
||||||
|
! If we are the "master" process (i.e., MPI_COMM_WORLD rank 0), put
|
||||||
|
! the number of times to go around the ring in the message.
|
||||||
|
|
||||||
if (rank .eq. 0) then
|
if (rank .eq. 0) then
|
||||||
message = 10
|
message = 10
|
||||||
|
|
||||||
print *, 'Process 0 sending ', message, ' to ', next
|
print *, 'Process 0 sending ', message, ' to ', next
|
||||||
call MPI_SEND(message, 1, MPI_INTEGER, next, tag, MPI_COMM_WORLD, ierr)
|
call MPI_SEND(message, 1, MPI_INTEGER, next, tag, MPI_COMM_WORLD, ierr)
|
||||||
|
print *, 'Process 0 sent to ', next
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
! Pass the message around the ring. The exit mechanism works as
|
||||||
|
! follows: the message (a positive integer) is passed around the ring.
|
||||||
|
! Each time it passes rank 0, it is decremented. When each processes
|
||||||
|
! receives a message containing a 0 value, it passes the message on to
|
||||||
|
! the next process and then quits. By passing the 0 message first,
|
||||||
|
! every process gets the 0 message and can quit normally.
|
||||||
|
|
||||||
10 call MPI_RECV(message, 1, MPI_INTEGER, from, tag, MPI_COMM_WORLD, &
|
10 call MPI_RECV(message, 1, MPI_INTEGER, from, tag, MPI_COMM_WORLD, &
|
||||||
MPI_STATUS_IGNORE, ierr)
|
MPI_STATUS_IGNORE, ierr)
|
||||||
@ -43,11 +58,16 @@ program ring
|
|||||||
endif
|
endif
|
||||||
goto 10
|
goto 10
|
||||||
|
|
||||||
|
! The last process does one extra send to process 0, which needs to be
|
||||||
|
! received before the program can exit
|
||||||
|
|
||||||
20 if (rank .eq. 0) then
|
20 if (rank .eq. 0) then
|
||||||
call MPI_RECV(message, 1, MPI_INTEGER, from, tag, MPI_COMM_WORLD, &
|
call MPI_RECV(message, 1, MPI_INTEGER, from, tag, MPI_COMM_WORLD, &
|
||||||
MPI_STATUS_IGNORE, ierr)
|
MPI_STATUS_IGNORE, ierr)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
! All done
|
||||||
|
|
||||||
call MPI_FINALIZE(ierr)
|
call MPI_FINALIZE(ierr)
|
||||||
end program
|
end program
|
||||||
|
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user