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
环境下是否能执行MPI
的API
也不同,一共分为四个等级分别是:
-
MPI_THREAD_SINGLE
只开启了一个线程。 -
MPI_THREAD_FUNNELED
开启了多个线程,但是只有主线程可以进行MPI Call`,其他线程不能。 -
MPI_THREAD_SERIALIZED
进程可以是多线程的,多个线程也可以进行MPI Call
,但一次(同一时刻)只能进行一个:MPI
调用不是从两个不同的线程并发进行的(所有MPI Call
都是序列化的)。 -
MPI_THREAD_MULTIPLE
进程中开启的所有线程都是可以进行MPI Call
,没有任何限制。
存在的疑问:
-
MPI_Init_thread()
默认开启的线程是多少个,如何使用这些线程呢? -
MPI_Init()
在一个进程中,就不能使用多个线程了吗?
网友评论