通过MPI正常退出 [英] Gracefully exit with MPI
问题描述
如果Rdinput返回错误,我试图正常退出程序.
I'm trying to gracefully exit my program after if Rdinput returns an error.
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#define MASTER 0
#define Abort(x) MPI_Abort(MPI_COMM_WORLD, x)
#define Bcast(send_data, count, type) MPI_Bcast(send_data, count, type, MASTER, GROUP) //root --> MASTER
#define Finalize() MPI_Finalize()
int main(int argc, char **argv){
//Code
if( rank == MASTER ) {
time (&start);
printf("Initialized at %s\n", ctime (&start) );
//Read file
error = RdInput();
}
Bcast(&error, 1, INT); Wait();
if( error = 1 ) MPI_Abort(1);
//Code
Finalize();
}
程序输出:
mpirun -np 2 code.x
--------------------------------------------------------------------------
MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD
with errorcode 1.
NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes.
You may or may not see output from other processes, depending on
exactly when Open MPI kills them.
--------------------------------------------------------------------------
Initialized at Wed May 30 11:34:46 2012
Error [RdInput]: The file "input.mga" is not available!
--------------------------------------------------------------------------
mpirun has exited due to process rank 0 with PID 7369 on
node einstein exiting improperly. There are two reasons this could occur:
//More error message.
我该怎么做才能在不打印此巨大错误消息的情况下正常退出MPI程序?
What can I do to gracefully exit an MPI program without printing this huge error message?
推荐答案
如果您的代码中包含以下逻辑:
If you have this logic in your code:
Bcast(&error, 1, INT);
if( error = 1 ) MPI_Abort(1);
那您就快完成了(尽管在广播后不需要任何等待).您发现的诀窍是MPI_Abort()
不会 做到优美";基本上,当发生严重错误时,可以以任何可能的方式关闭计算机.
then you're just about done (although you don't need any kind of wait after a broadcast). The trick, as you've discovered, is that MPI_Abort()
does not do "graceful"; it basically is there to shut things down in whatever way possible when something's gone horribly wrong.
在这种情况下,由于现在每个人都同意广播后的错误代码,所以请妥善地结束程序:
In this case, since now everyone agrees on the error code after the broadcast, just do a graceful end of your program:
MPI_Bcast(&error, 1, MPI_INT, MASTER, MPI_COMM_WORLD);
if (error != 0) {
if (rank == 0) {
fprintf(stderr, "Error: Program terminated with error code %d\n", error);
}
MPI_Finalize();
exit(error);
}
调用MPI_Finalize()
并继续处理更多MPI内容是一个错误,但这不是您在这里所做的,所以您还可以.
It's an error to call MPI_Finalize()
and keep on going with more MPI stuff, but that's not what you're doing here, so you're fine.
这篇关于通过MPI正常退出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!