TypechoJoeTheme

MetMan's Blog

网站页面

MPI IO错误处理

MetMan博 主
2023-10-21
/
0 评论
/
162 阅读
/
557 个字
/
百度未收录
10/21
本文最后更新于 2023年10月21日,已超过 334天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

本周遇到一个MPI IO的问题让我对MPI标准在遇到错误时如何处理有了更深入的了解,在此记录一下。

问题

问题是这样的:有一个MPI并行程序,IO部分是通过MPI IO函数并行读入(MPI_FILE_OPEN())一个文件,但程序执行时在没有找到该文件情况下仍然继续执行。由于我没对MPI_FILE_OPEN函数返回码进行检查,程序正常运行,但读入数组实际上值是0,根本不是期望的值。出问题后还不容易查找。

这与我对文件IO出错处理理解不一样,比如对于Fortran open语句默认找不到文件程序会报错终止。

原因

通过查阅MPI标准说明,发现MPI标准规定了MPI库运行时一旦侦测到错误时会终止程序运行,但文件操作例外。

MPI IO 产生错误不会像通信错误一样被认为是致命的(MPI_ERRORS_ARE_FATAL),仅仅是捕捉这些错误(函数返回码)并继续执行程序。

MPI标准预定义了两个错误handlers:

  • MPI_ERRORS_ARE_FATAL 致命错误,一旦侦测到,调用MPI_ABORT退出
  • MPI_ERRORS_RETURN 仅仅返回错误码给用户,其它没有影响

MPI IO文件处理的缺省预定义错误handler是MPI_ERRORS_RETURN,因此在遇到如“文件找不到”错误时不会终止程序。

MPI标准提供了MPI_FILE_SET_ERRHANDLER函数设置文件错误handler。

MPI_FILE_SET_ERRHANDLER(FILE, ERRHANDLER, IERROR)
  INTEGER FILE, ERRHANDLER, IERROR

该函数第一个参数需要文件句柄FILE,但只有MPI_FILE_OPEN函数成功执行后才能获得文件句柄。好在MPI标准提供了一个预定义的常量MPI_FILE_NULL用于还没有有效文件句柄时。

解决方法

在读该文件前设置错误handle为MPI_ERRORS_ARE_FATAL

call MPI_FILE_SET_ERRHANDLER(MPI_FILE_NULL, MPI_ERRORS_ARE_FATAL, ierr)

call MPI_FILE_OPEN(...)

再次执行程序时,侦测文件不存在,程序报错并输出错误信息如下:

I/O error: File does not exist, error stack:
ADIOI_NFS_OPEN(69): File foo.dat does not exist

另一种方法是对MPI_FILE_OPEN函数返回码进行判断,函数未成功执行则终止程序程序

 if (ierr /= MPI_SUCCESS) then
   call MPI_ABORT()
 endif

补充

MPI标准还提供了查询当前默认文件错误句柄函数:

通过MPI_FILE_GET_ERRHANDLER函数,其中第一个文件句柄参数可以指定为MPI_FILE_NULL

MPI_FILE_GET_ERRHANDLER(FILE, ERRHANDLER, IERROR)
  INTEGER FILE, ERRHANDLER, IERROR

此外,MPI标准还支持自定义错误处理方法,但我还没发现有多大用处,感兴趣的可以查阅MPI标准说明了解。

朗读
赞(0)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

MetMan's Blog

本文链接:

https://blog.metman.top/index.php/archives/13/(转载时请注明本文出处及文章链接)

评论 (0)

互动读者

标签云

最新回复

暂无回复

登录
X
用户名
密码