Skip to content

Commit 2698f56

Browse files
committed
ajout de la fonction MPI_Wait pour l'interposition Fortran
1 parent 16c7f0f commit 2698f56

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

src/interpolf.c

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,4 +620,63 @@ _EXTERN_C_ void mpi_test_(MPI_Fint *request, MPI_Fint *flag, MPI_Fint *status, M
620620

621621
_EXTERN_C_ void mpi_test__(MPI_Fint *request, MPI_Fint *flag, MPI_Fint *status, MPI_Fint *ierr) {
622622
MPI_Test_fortran_wrapper(request, flag, status, ierr);
623+
}
624+
625+
626+
static void MPI_Wait_fortran_wrapper(MPI_Fint *request, MPI_Fint *status, MPI_Fint *ierr) {
627+
int _wrap_py_return_val = 0;
628+
629+
Tsc const tsc = rdtsc();
630+
631+
#if (!defined(MPICH_HAS_C2F) && defined(MPICH_NAME) && (MPICH_NAME == 1)) /* MPICH test */
632+
_wrap_py_return_val = PMPI_Wait((MPI_Request*)request, (MPI_Status*)status);
633+
#else /* MPI-2 safe call */
634+
MPI_Request temp_request;
635+
MPI_Status temp_status;
636+
temp_request = MPI_Request_f2c(*request);
637+
MPI_Status_f2c(status, &temp_status);
638+
_wrap_py_return_val = PMPI_Wait(&temp_request, &temp_status);
639+
*request = MPI_Request_c2f(temp_request);
640+
MPI_Status_c2f(&temp_status, status);
641+
#endif /* MPICH test */
642+
643+
Tsc const duration = rdtsc() - tsc;
644+
645+
MpiCall const wait = {
646+
.kind = Wait,
647+
.time = -1.0,
648+
.tsc = tsc,
649+
.duration = duration,
650+
.current_rank = current_rank,
651+
.partner_rank = -1,
652+
.nb_bytes_s = 0,
653+
.nb_bytes_r = 0,
654+
.comm = -1,
655+
.req = *request,
656+
.tag = -1,
657+
.required_thread_lvl = -1,
658+
.provided_thread_lvl = -1,
659+
.op_type = -1,
660+
.finished = false,
661+
};
662+
663+
register_mpi_call(wait);
664+
665+
*ierr = _wrap_py_return_val;
666+
}
667+
668+
_EXTERN_C_ void MPI_WAIT(MPI_Fint *request, MPI_Fint *status, MPI_Fint *ierr) {
669+
MPI_Wait_fortran_wrapper(request, status, ierr);
670+
}
671+
672+
_EXTERN_C_ void mpi_wait(MPI_Fint *request, MPI_Fint *status, MPI_Fint *ierr) {
673+
MPI_Wait_fortran_wrapper(request, status, ierr);
674+
}
675+
676+
_EXTERN_C_ void mpi_wait_(MPI_Fint *request, MPI_Fint *status, MPI_Fint *ierr) {
677+
MPI_Wait_fortran_wrapper(request, status, ierr);
678+
}
679+
680+
_EXTERN_C_ void mpi_wait__(MPI_Fint *request, MPI_Fint *status, MPI_Fint *ierr) {
681+
MPI_Wait_fortran_wrapper(request, status, ierr);
623682
}

0 commit comments

Comments
 (0)