From 9cfb2af9ac9c7cc30da3d9c7c6e496d9261f6dfe Mon Sep 17 00:00:00 2001 From: ignis Date: Fri, 14 Jun 2019 18:46:51 +0900 Subject: [PATCH] non-busy-waiting dispatch --- code/post.f90 | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/code/post.f90 b/code/post.f90 index 5395a4f..37fcda6 100644 --- a/code/post.f90 +++ b/code/post.f90 @@ -102,6 +102,7 @@ SUBROUTINE main_lb INTEGER :: fread,i + LOGICAL :: received CALL READ_INTRO @@ -132,7 +133,13 @@ countnum=countnum+1 - CALL MPI_RECV(id_to, 1, MPI_INTEGER, MPI_ANY_SOURCE, tag, MPI_COMM_TASK, mpi_status, mpi_err) + CALL MPI_Irecv(id_to, 1, MPI_INTEGER, MPI_ANY_SOURCE, tag, MPI_COMM_TASK, mpi_request, mpi_err) + do + call MPI_Test(mpi_request, received, mpi_status, mpi_err) + if (received) exit + call SLEEP (1) + end do + CALL MPI_SEND(fread, 1, MPI_INTEGER, id_to, tag, MPI_COMM_TASK, mpi_err) ENDIF @@ -141,7 +148,13 @@ end_of_dispatch1: DO i=1,numprocs-1 - CALL MPI_RECV(id_to, 1, MPI_INTEGER, MPI_ANY_SOURCE, tag, MPI_COMM_TASK, mpi_status, mpi_err) + CALL MPI_Irecv (id_to, 1, MPI_INTEGER, MPI_ANY_SOURCE, tag, MPI_COMM_TASK, mpi_request, mpi_err) + do + call MPI_Test(mpi_request, received, mpi_status, mpi_err) + if (received) exit + call SLEEP (1) + end do + CALL MPI_SEND(-1, 1, MPI_INTEGER, id_to, tag, MPI_COMM_TASK, mpi_err) ENDDO end_of_dispatch1 @@ -190,7 +203,13 @@ ELSE - CALL MPI_RECV(id_to, 1, MPI_INTEGER, MPI_ANY_SOURCE, tag, MPI_COMM_TASK, mpi_status, mpi_err) + CALL MPI_Irecv(id_to, 1, MPI_INTEGER, MPI_ANY_SOURCE, tag, MPI_COMM_TASK, mpi_request, mpi_err) + do + call MPI_Test(mpi_request, received, mpi_status, mpi_err) + if (received) exit + call SLEEP (1) + end do + CALL MPI_SEND(fread, 1, MPI_INTEGER, id_to, tag, MPI_COMM_TASK, mpi_err) ENDIF @@ -199,7 +218,13 @@ end_of_dispatch2: DO i=1,numprocs-1 - CALL MPI_RECV(id_to, 1, MPI_INTEGER, MPI_ANY_SOURCE, tag, MPI_COMM_TASK, mpi_status, mpi_err) + CALL MPI_Irecv (id_to, 1, MPI_INTEGER, MPI_ANY_SOURCE, tag, MPI_COMM_TASK, mpi_request, mpi_err) + do + call MPI_Test(mpi_request, received, mpi_status, mpi_err) + if (received) exit + call SLEEP (1) + end do + CALL MPI_SEND(-1, 1, MPI_INTEGER, id_to, tag, MPI_COMM_TASK, mpi_err) ENDDO end_of_dispatch2