三、两步非阻塞组调用
对于非阻塞的组读写调用,MPI-2提供了特殊的调用形式,即两步非阻塞组调用形式。其含义是,在非阻塞组读写调用的开始,执行"开始"读写组调用语句,在非阻塞组读写调用的结束,执行"完成"读写组调用语句。在功能上,"完成"读写组调用语句和相应的MPI_WAIT语句是非常接近的。
所谓的两步非阻塞组调用,就是将原来一个完整的组调用分成两步,第一步是启动该非阻塞组调用,第二步是完成该非阻塞组调用。由于有了第二步的调用,在两步非阻塞调用中,就不需要再象其它的非阻塞调用那样执行MPI_WAIT之类的操作来完成非阻塞调用。
两步非阻塞组调用是一种形式严格的非阻塞组调用方法,使用这种方法有助于对这一调用的优化实现。
进程0
|
进程1
|
进程N-1
|
MPI_FILE_..._BEGIN
(开始非阻塞组读写调用)
|
MPI_FILE_..._BEGIN
(开始非阻塞组读写调用)
|
MPI_FILE_..._BEGIN
(开始非阻塞组读写调用)
|
...
MPI_FILE_..._END
(完成非阻塞组读写调用)
|
...
MPI_FILE_..._END
(完成非阻塞组读写调用)
|
...
MPI_FILE_..._END
(完成非阻塞组读写调用)
|
MPI_FILE_READ_AT_ALL_BEGIN"开始"一个非阻塞的读组调用,与文件句柄fh对应的进程组内的进程都从各自进程指定的偏移位置offset开始,读取count个类型为datatype的数据,并且将结果存放在buf中。这一语句的完成要通过进程组内各进程都执行
MPI_FILE_READ_AT_ALL_END来实现,即只有当执行了MPI_FILE_READ_AT_ALL_END调用,各进程才可以访问buf缓冲区中的数据。
MPI_FILE_READ_AT_ALL_END(fh, buf, status)
INfh读取数据的文件句柄
OUT buf 读取数据存放的缓冲区
OUT status该调用完成后返回的状态信息
int MPI_File_read_at_all_end(MPI_File fh, void * buf, MPI_Status *status)
MPI_FILE_READ_AT_ALL_END(FH, BUF, STATUS, IERROR)
<type> BUF(*)
INTEGER FH, STATUS(MPI_STATUS_SIZE), IERROR
|