2014-11-06 7 views
1

로 mpif90 컴파일 과도하게 단순화 FORTRAN 코드 가정 차단하지 않고 FORTRAN에서 서브 루틴을 호출 : 기본적으로메인 프로그램

program main 
! 
    use mpi 
    implicit none 
    integer:: j, numtasks, taskid, ierr 
    integer:: master = 0 
! 
    call mpi_init(ierr) 
    call mpi_comm_rank(mpi_comm_world, taskid, ierr) 
! 
    if (taskid .eq. master) then 
     j = 5 
     call child (j) 
    ! do stuff 
    end if 
    call mpi_finalize(ierr) 
! 
end program main 

subroutine child(j) 
! 
    implicit none 
    integer, intent(in):: j 
! do some stuff with j 
end subroutine child 

을 주요 대기에서 마스터 CPU는 아이가 자신의 계산으로 완료 될 때까지 . 그러나 나는 그 아이가 그 일을하고있는 동안 아이를 부른 후에 그 일을 계속하기를 원한다. 메인에서 하위로 일부 데이터를 전달해야하므로 하위를 메인에 대한 서브 루틴으로 사용하고 싶습니다 (그 반대의 경우도 마찬가지 임). 나는 이것이 FORTRAN에서 가능한지 알고 싶다. (어쩌면 비 차단 서브 루틴 호출이나 mpi_comm_spawn과 같은 멀티 스레딩을 사용해서).

답변

1

나는 이것을 위해 POSIX 스레드를 사용할 것이다. 어쩌면 OpenMP 작업 일 수도 있지만 내 경험은 제한적입니다. child에 MPI 절차를 요청하지 않았다고 가정합니다. C에서 간단한 인터페이스와

#include <pthread.h> 

void pthread_create_opaque(pthread_t *threadptr, void *procptr, void *dataptr, int *err){ 
// creates a new thread using an opaque pointer to the pthread_t structure 
    *err = pthread_create(threadptr, NULL, procptr, dataptr); 
} 

void pthread_join_opaque(pthread_t *threadptr, int *err) { 
// joines a thread using an opaque pointer to the pthread_t structure 
*err = pthread_join(*threadptr, NULL); 
} 

및 포트란

에서
module Pthreads 
    implicit none 

    interface 
    subroutine pthread_create_opaque(threadptr, procptr, dataptr, err) bind(C,name="pthread_create_opaque") 
     use iso_c_binding 
     type(c_ptr) :: threadptr 
     type(c_funptr),value :: procptr 
     type(c_ptr),value :: dataptr 
     integer(c_int),intent(out) :: err 
    end subroutine 

    subroutine pthread_join_opaque(thread, err) bind(C,name="pthread_join_opaque") 
     use iso_c_binding 
     type(c_ptr),value :: thread 
     integer(c_int),intent(out) :: err 
    end subroutine 
    end interface 
end module Pthreads 

가 상호 C

type(c_ptr) :: thread 
integer :: err 

call pthread_create_opaque(thread, c_funloc(join), loc(j), err) 
단순히

subroutine child(j) bind(C) 
! 
    implicit none 
    integer, intent(in):: j 
! do some stuff with j 
end subroutine child 

경우 당신이 아이를 호출 할 수 있습니다

나중에 어떤 편리한 장소에서의 작업 나는 시간 스텝 데이터의 비동기 출력을위한 MPI 병렬 프로그램에 성공적를 사용

call pthread_join_opaque(thread, err) 

을 완료하는 데 기다립니다 (프로그램이 끝나기 전에 어디든지).