25. MPIとの連携¶
25.1. MPIプログラムの呼び出し¶
下記の関数を用いることで,XMPプログラムからMPIプログラムを呼び出せます.
- MPI環境の初期化
Language | Retrun Value | Function |
---|---|---|
XMP/C | void | xmp_init_mpi(int*, char***) |
XMP/Fortran | (None) | xmp_init_mpi() |
- ノード集合に対するMPIコミュニケータの取得
Language | Retrun Value | Function |
---|---|---|
XMP/C | MPI_Comm | xmp_get_mpi_comm(void) |
XMP/Fortran | integer | xmp_get_mpi_comm() |
- MPI環境の完了処理
Language | Retrun Value | Function |
---|---|---|
XMP/C | void | xmp_finalize_mpi(void) |
XMP/Fortran | (None) | xmp_finalize_mpi() |
- XMP/Cプログラム
#include <mpi.h>
#include <xmp.h>
#pragma xmp nodes p[4]
int main(int argc, char **argv) {
xmp_init_mpi(&argc, &argv);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
#pragma xmp task on p[1:2]
{
MPI_Comm comm = xmp_get_mpi_comm();
MPI_Bcast(..., comm);
}
xmp_finalize_mpi();
return 0;
}
- XMP/Fortranプログラム
program main
include 'mpif.h'
integer rank, irank, isize, ierr
integer xmp_get_mpi_comm
integer comm
!$xmp nodes p(4)
call xmp_init_mpi()
!$xmp task on p(2:3)
comm = xmp_get_mpi_comm()
call MPI_Bcast(..., comm, ...)
!$xmp end task
call xmp_finalize_mpi()
end program
xmp_init_mpi()はMPI環境の初期化をXMPプログラムで行い, xmp_finalize_mpi()はMPI環境の完了処理をXMPプログラムで行います. その2つの関数の間で,任意のMPI関数とxmp_get_mpi_comm()を呼び出すことができます. xmp_get_mpi_comm()は,現在実行されているノード集合(上のXMP/Cではp[1:2],XMP/Fortranではp(2:3)で構成される2ノード)のMPIコミュニケータを取得できます.
25.2. MPIプログラムからの呼び出し¶
下記の関数を用いることで,MPIプログラムからXMPプログラムを呼び出せます.
- XMP環境の初期化
Language | Retrun Value | Function |
---|---|---|
XMP/C | void | xmp_init(MPI_Comm) |
XMP/Fortran | (None) | xmp_init(Integer) |
- XMP環境の完了処理
Language | Retrun Value | Function |
---|---|---|
XMP/C | void | xmp_finalize(void) |
XMP/Fortran | (None) | xmp_finalize() |
- MPI/Cプログラム
#include <mpi.h>
#include <xmp.h>
extern void xmp_sub();
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
xmp_init(MPI_COMM_WORLD);
sub_xmp();
xmp_finalize();
MPI_Finalize();
return 0;
}
- XMP/Cプログラム
void sub_xmp() {
#pragma xmp nodes p[4]
:
}
- MPI/Fortranプログラム
program test
include 'mpif.h'
integer ierror
call MPI_INIT(ierror)
call xmp_init(MPI_COMM_WORLD)
call xmp_sub()
call xmp_finalize()
call MPI_FINALIZE(ierror)
end program test
- XMP/Fortranプログラム
subroutine sub_xmp()
!$xmp nodes p(4)
:
end subroutine hoge
xmp_init()はXMP環境の初期化をMPIプログラムで行い, xmp_finalize()はXMP環境の完了処理をMPIプログラムで行います. 2つの関数の間で,任意のXMP関数を呼び出すことができます. なお,xmp_init()はMPI_Init()の後,xmp_finalize()はMPI_Finalize()の前に実行する必要があります.