Segmentation fault MPI\u通信\u繁殖\u多段故障

Segmentation fault MPI\u通信\u繁殖\u多段故障,segmentation-fault,mpi,Segmentation Fault,Mpi,我尝试运行invoke-MPI\u-Comm\u-spawn\u-multiple来生成多个进程,但是,有一些有趣的事情。当我生成40个子进程时,它运行得很好。当我生成80个子进程时,它告诉我分段错误。如果在MPI_信息中设置了“wdir”,并且生成的子进程数量足够大(在我的测试中,它应该大于53),则会出现问题。我想知道是否有人受苦或知道如何解决这个问题。我的MPI版本是mvapich2-1.8.1 下面是我的代码: #include "mpi.h" #include <stdio.h&

我尝试运行invoke-MPI\u-Comm\u-spawn\u-multiple来生成多个进程,但是,有一些有趣的事情。当我生成40个子进程时,它运行得很好。当我生成80个子进程时,它告诉我分段错误。如果在MPI_信息中设置了“wdir”,并且生成的子进程数量足够大(在我的测试中,它应该大于53),则会出现问题。我想知道是否有人受苦或知道如何解决这个问题。我的MPI版本是mvapich2-1.8.1

下面是我的代码:

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>

#define P_SIZE 80
int main( int argc, char *argv[] )
{
    int np[P_SIZE],i;
    int errcodes[P_SIZE];
    MPI_Comm parentcomm, intercomm;
    char *cmds[P_SIZE];
    MPI_Info infos[P_SIZE];

    for(i=0;i<P_SIZE;i++){
    np[i]=1;
        MPI_Info_create(&infos[i]);
    cmds[i]="./spawn_example";
    }
for(i=0;i<10;i++){ MPI_Info_set(infos[i], "hosts", "node1");MPI_Info_set(infos[i], "wdir", "/home");}
for(i=10;i<20;i++){ MPI_Info_set(infos[i], "hosts", "node2");MPI_Info_set(infos[i], "wdir", "/home");}
for(i=20;i<30;i++){ MPI_Info_set(infos[i], "hosts", "node3");MPI_Info_set(infos[i], "wdir", "/home");}
for(i=30;i<40;i++){ MPI_Info_set(infos[i], "hosts", "node4");MPI_Info_set(infos[i], "wdir", "/home");}
for(i=40;i<50;i++){ MPI_Info_set(infos[i], "hosts", "node5");MPI_Info_set(infos[i], "wdir", "/home");}
for(i=50;i<60;i++){ MPI_Info_set(infos[i], "hosts", "node6");MPI_Info_set(infos[i], "wdir", "/home");}
for(i=60;i<70;i++){ MPI_Info_set(infos[i], "hosts", "node7");MPI_Info_set(infos[i], "wdir", "/home");}
for(i=70;i<80;i++){ MPI_Info_set(infos[i], "hosts", "node8");MPI_Info_set(infos[i], "wdir", "/home");}

    MPI_Init( &argc, &argv );
    MPI_Comm_get_parent( &parentcomm );
    if (parentcomm == MPI_COMM_NULL)
    {
        MPI_Comm_spawn_multiple( P_SIZE, cmds, MPI_ARGVS_NULL, np, infos, 0, MPI_COMM_SELF, &intercomm, errcodes );
        printf("I'm the parent.\n"); 
    }
    else
    {
        printf("I'm the spawned.\n");
    }
    fflush(stdout);
    MPI_Finalize();
    return 0;
}
#包括“mpi.h”
#包括
#包括
#定义P_尺寸80
int main(int argc,char*argv[])
{
int np[P_SIZE],i;
int errcode[P_SIZE];
MPI_通信、家长通信、内部通信;
char*cmds[P_SIZE];
MPI_信息信息[P_大小];

对于(i=0;iYou在调用MPI_Init之前调用MPI_*函数——这是不允许的。第一个命令必须是MPI_Init,或类似的命令,如MPI_Init_线程。我曾尝试将MPI_Init或MPI_Init_线程放在任何MPI函数调用之前,但仍然不起作用,并给出相同的错误“分段错误”没有任何MPI信息。我不知道为什么,但它似乎在mpich2-1.3上运行良好。也许,在mvapich上的mpd模式下也运行良好。