这些退出代码对于MPI程序意味着什么?
当我试图运行MPI程序但失败时。它说:这些退出代码对于MPI程序意味着什么?,mpi,Mpi,当我试图运行MPI程序但失败时。它说: job aborted: [ranks] message [0] process exited without calling finalize [1-3] terminated 错误分析表明退出代码为0xc000005 然后我用谷歌搜索它,有人说用MPI\u Init\u thread代替,但它给了我255作为退出代码 我怎样才能修好它?排名0的过程有什么问题 以下是使用MPI发送和接收数据的代码片段: // MPI things
job aborted:
[ranks] message
[0] process exited without calling finalize
[1-3] terminated
错误分析表明退出代码为0xc000005
然后我用谷歌搜索它,有人说用MPI\u Init\u thread
代替,但它给了我255
作为退出代码
我怎样才能修好它?排名0的过程有什么问题
以下是使用MPI发送和接收数据的代码片段:
// MPI things
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
// master
if (taskid == 0)
{
//printf("taskid: %d", taskid);
average = Nchunk / Nworkers;
extra = Nchunk % Nworkers;
mtype = FROM_MASTER;
offset = 0;
// store volume[Itemp[n]]
for (int i = 0; i < Nchunk; i++)
{
volumeTemp[i] = volume[Itemp[i]];
}
// send to slave
for (int dest = 1; dest <= Nworkers; dest++)
{
Nelements = (dest <= extra) ? average + 1 : average;
MPI_Send(&Nelements, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD);
MPI_Send(&offset, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD);
MPI_Send(&Itemp[offset], Nelements, MPI_INT, dest, mtype, MPI_COMM_WORLD);
MPI_Send(&SMtemp[offset], Nelements, MPI_FLOAT, dest, mtype, MPI_COMM_WORLD);
MPI_Send(&volumeTemp[offset], Nelements, MPI_FLOAT, dest, mtype, MPI_COMM_WORLD);
offset = offset + Nelements;
}
// receive result from slave
mtype = FROM_WORKERS;
for (int source = 1; source <= Nworkers; source++)
{
//MPI_Recv(&average, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status);
//MPI_Recv(&offset, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status);
MPI_Recv(&sinogram[ns], 1, MPI_FLOAT, source, mtype, MPI_COMM_WORLD, &status);
}
}
//printf("taskid: %d", taskid);
// slave
if (taskid > 0)
{
//printf("taskid: %d", taskid);
mtype = FROM_MASTER;
MPI_Recv(&Nelements, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status);
MPI_Recv(&offset, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status);
MPI_Recv(&Itemp[offset], Nelements, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status);
MPI_Recv(&SMtemp[offset], Nelements, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status);
MPI_Recv(&volumeTemp, Nelements, MPI_FLOAT, MASTER, mtype, MPI_COMM_WORLD, &status);
for (int i = 0; i < average; i++)
{
if (fabs(volumeTemp[i]) > 1.0e-14)
sinogram[ns] = sinogram[ns] + volumeTemp[i] * SMtemp[i];
}
//send to master
mtype = FROM_WORKERS;
MPI_Send(&sinogram[ns], 1, MPI_FLOAT, MASTER, mtype, MPI_COMM_WORLD, &status);
}
//MPI事物
MPI通信等级(MPI通信世界和任务ID);
//主人
如果(taskid==0)
{
//printf(“任务ID:%d”,任务ID);
平均值=非熟练工人/非熟练工人;
额外=n解雇%n名工人;
mtype=来自主控;
偏移量=0;
//存储卷[Itemp[n]]
对于(int i=0;i 对于(int dest=1;dest,MPI的退出代码几乎没有任何意义,因为您有多个进程都返回自己的错误代码。依赖程序发出的错误消息会更有帮助。幸运的是,您的程序做到了
[0] process exited without calling finalize
这可能意味着两件事之一
您的程序已完成,但未调用MPI\u Finalize
。这是一个非常简单的修复方法。请检查以确保您的程序可以在任何地方正常终止,它都会调用MPI\u Finalize
。但这可能是您的问题,也可能不是
您的程序异常终止。这通常更难跟踪,并且可能需要一些常见的技巧。如果是问题,我们可能无法修复您的问题,除非您的代码非常小或您需要
显示代码,它可以是任何东西。尝试找出进程在代码中的位置。它应该是MCVE…抱歉,这是我第一次发布我的问题。我附加了一个代码片段以使其更好谢谢你。我将尝试调试。我在main()中执行MPI_Init和MPI_Finalize,并在main()中调用的另一个函数中执行MPI操作。