MPI环境初始化

MPI两个不同的初始化函数MPI_Init()和MPI_Init_Thread()

mpi环境的初始化方式一种有两种:MPI_Init()MPI_Init_thread().

两个函数根据mpich实现的API参数解释设置为:

MPI_Init(int *argc, char ***argv ) 函数

# MPI_Init
> Initialize the MPI execution environment
# Synopsis

`int MPI_Init( int *argc, char ***argv )`

# Input Parameters

argc
    Pointer to the number of arguments 
argv
    Pointer to the argument vector 

# Thread and Signal Safety
> This routine must be called by one thread only. That thread is called the main thread and must be the thread that calls MPI_Finalize.

# Notes
> The MPI standard does not say what a program can do before an MPI_INIT or after an MPI_FINALIZE. In the MPICH implementation, you should do as little as possible. In particular, avoid anything that changes the external state of the program, such as opening files, reading standard input or writing to standard output.

# Notes for C
> As of MPI-2, MPI_Init will accept NULL as input parameters. Doing so will impact the values stored in MPI_INFO_ENV.

# Notes for Fortran
> The Fortran binding for MPI_Init has only the error return

    subroutine MPI_INIT( ierr )
    integer ierr

# Errors

>All MPI routines (except `MPI_Wtime` and `MPI_Wtick`) return an error value; C routines as the value of the function and Fortran routines in the last argument. Before the value is returned, the current MPI error handler is called. By default, this error handler aborts the MPI job. The error handler may be changed with `MPI_Comm_set_errhandler` (for communicators), `MPI_File_set_errhandler` (for files), and `MPI_Win_set_errhandler` (for RMA windows). The MPI-1 routine `MPI_Errhandler_set` may be used but its use is deprecated. The predefined error handler `MPI_ERRORS_RETURN` may be used to cause error values to be returned. Note that MPI does not guarentee that an MPI program can continue past an error; however, MPI implementations will attempt to continue whenever possible.

# MPI_SUCCESS
    No error; MPI routine completed successfully. 

# MPI_ERR_OTHER
    This error class is associated with an error code that indicates that an attempt was made to call MPI_INIT a second time. MPI_INIT may only be called once in a program. 

See Also MPI_Init_thread, MPI_Finalize

Location:src/mpi/init/init.c

MPI_Init函数主要表示的在开启的MPI环境中每个Processer都是使用一个线程main thread进行调用MPI环境中的API,同时在MPI环境结束时,也必须由这个主线程进行调用MPI_Finalize

也就是说,MPI允许这个Processer存在多个thread,但是在MPI环境的开启中只开启了一个main thread,如果要开启其他线程的话,也仅由用户自行开启,但是调用和使用MPI环境下的API只能由main thread进行调用。

MPI_Init_thread(int *argc, char ***argv, int required, int *provided)函数

# MPI_Init_thread
> Initialize the MPI execution environment
# Synopsis

`int MPI_Init_thread( int *argc, char ***argv, int required, int *provided )`

# Input Parameters

argc
    Pointer to the number of arguments 
argv
    Pointer to the argument vector 
required
    Level of desired thread support 

# Output Parameters

provided
    Level of provided thread support 

# Command line arguments
> MPI specifies no command-line arguments but does allow an MPI implementation to make use of them. See MPI_INIT for a description of the command line arguments supported by MPI_INIT and MPI_INIT_THREAD.

# Notes
> The valid values for the level of thread support are:

MPI_THREAD_SINGLE
    Only one thread will execute. 
MPI_THREAD_FUNNELED
    The process may be multi-threaded, but only the main thread will make MPI calls (all MPI calls are funneled to the main thread). 
MPI_THREAD_SERIALIZED
    The process may be multi-threaded, and multiple threads may make MPI calls, but only one at a time: MPI calls are not made concurrently from two distinct threads (all MPI calls are serialized). 
MPI_THREAD_MULTIPLE
    Multiple threads may call MPI, with no restrictions. 

# Notes for Fortran
> Note that the Fortran binding for this routine does not have the argc and argv arguments. (MPI_INIT_THREAD(required, provided, ierror))

# Errors

> All MPI routines (except `MPI_Wtime` and `MPI_Wtick`) return an error value; C routines as the value of the function and Fortran routines in the last argument. Before the value is returned, the current MPI error handler is called. By default, this error handler aborts the MPI job. The error handler may be changed with `MPI_Comm_set_errhandler` (for communicators), `MPI_File_set_errhandler` (for files), and `MPI_Win_set_errhandler` (for RMA windows). The MPI-1 routine `MPI_Errhandler_set` may be used but its use is deprecated. The predefined error handler `MPI_ERRORS_RETURN` may be used to cause error values to be returned. Note that MPI does not guarentee that an MPI program can continue past an error; however, MPI implementations will attempt to continue whenever possible.

MPI_SUCCESS
    No error; MPI routine completed successfully. 

MPI_ERR_OTHER
    Other error; use MPI_Error_string to get more information about this error code. 

See Also MPI_Init, MPI_Finalize

Location:src/mpi/init/initthread.c

MPI_Init_thread函数允许MPI环境下开启多个线程,根据开启线程的等级不同,线程在MPI环境下是否能执行MPIAPI也不同,一共分为四个等级分别是:

  1. MPI_THREAD_SINGLE只开启了一个线程。
  2. MPI_THREAD_FUNNELED 开启了多个线程,但是只有主线程可以进行MPI Call`,其他线程不能。
  3. MPI_THREAD_SERIALIZED 进程可以是多线程的,多个线程也可以进行MPI Call,但一次(同一时刻)只能进行一个:MPI调用不是从两个不同的线程并发进行的(所有MPI Call都是序列化的)。
  4. MPI_THREAD_MULTIPLE 进程中开启的所有线程都是可以进行MPI Call,没有任何限制。

存在的疑问:

  1. MPI_Init_thread()默认开启的线程是多少个,如何使用这些线程呢?
  2. MPI_Init() 在一个进程中,就不能使用多个线程了吗?

你可能感兴趣的:(MPI环境初始化)