C 递归mpi繁殖(从繁殖中繁殖)

C 递归mpi繁殖(从繁殖中繁殖),c,recursion,openmpi,C,Recursion,Openmpi,问题很简单:管理者产生X个工人。如果满足某个条件,则每个工人将多产生2个工人。只要工人不再产卵,一切正常(因此条件不满足,或者只有第一个“原始”工人产卵;其他工人挂起) 经理代码: int main(int argc, char *argv[]) { int myrank, numworkers, tag = 3, sum = 0, K = 1; MPI_Status status; MPI_Comm workercomm; numworkers = atoi(argv[1]); MPI_I

问题很简单:管理者产生X个工人。如果满足某个条件,则每个工人将多产生2个工人。只要工人不再产卵,一切正常(因此条件不满足,或者只有第一个“原始”工人产卵;其他工人挂起)

经理代码:

int main(int argc, char *argv[]) {
int myrank, numworkers, tag = 3, sum = 0, K = 1;
MPI_Status status;
MPI_Comm workercomm;

numworkers = atoi(argv[1]);

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Comm_spawn("Project_child",
        MPI_ARGV_NULL, numworkers, MPI_INFO_NULL, 0, MPI_COMM_SELF,
        &workercomm, MPI_ERRCODES_IGNORE);

for (int i = 0; i < numworkers; i++) { //sends 1,2,3... to workers
    K=i+1;
    MPI_Send(&K, 1, MPI_INT, i, tag, workercomm);
}

for (int i = 0; i < numworkers; i++) { //receives an int from worker
    MPI_Recv(&K, 1, MPI_INT, i, tag, workercomm, &status);
    sum += K;
}
printf("%d \n", sum);

MPI_Comm_free(&workercomm);
MPI_Finalize();
return 0;
}
intmain(intargc,char*argv[]){
int myrank,numworkers,tag=3,sum=0,K=1;
MPI_状态;
MPI_通信工作通信;
numworkers=atoi(argv[1]);
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_Comm_WORLD和myrank);
MPI_Comm_spawn(“项目子项”,
MPI_ARGV_NULL,numworkers,MPI_INFO_NULL,0,MPI_COMM_SELF,
&工作命令、MPI错误代码(忽略);
for(int i=0;i
工人代码:

int main(int argc, char *argv[]) {
int K, myrank, tag = 3;
MPI_Status status;
MPI_Comm parentcomm;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Comm_get_parent(&parentcomm);

MPI_Recv(&K, 1, MPI_INT, 0, tag, parentcomm, &status); //recv K
printf("child %d: k=%d\n", myrank, K);
K++;
if (K<5) { // && myrank==0) {
    MPI_Comm childParentComm;
    MPI_Comm_spawn("Project_child",
            MPI_ARGV_NULL, 2, MPI_INFO_NULL, 0, MPI_COMM_SELF,
            &childParentComm, MPI_ERRCODES_IGNORE);
    //problem might be here?^

    //sends the K to first worker_child
    MPI_Send(&K, 1, MPI_INT, 0, tag, childParentComm);

    //!!!!!!! IT HANGS HERE if worker != 0

    K++;
    //sends K+1 to second worker_child
    MPI_Send(&K, 1, MPI_INT, 1, tag, childParentComm);

    int K1, K2;
    MPI_Recv(&K1, 1, MPI_INT, 0, tag, childParentComm, &status);
    MPI_Recv(&K2, 1, MPI_INT, 1, tag, childParentComm, &status);
    K = K1 + K2;
    MPI_Comm_free(&childParentComm);
}
MPI_Send(&K, 1, MPI_INT, 0, tag, parentcomm);
MPI_Comm_free(&parentcomm);
MPI_Finalize();
return 0;
}
intmain(intargc,char*argv[]){
int K,myrank,tag=3;
MPI_状态;
MPI_Comm parentcomm;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_Comm_WORLD和myrank);
MPI_Comm_get_parent(&parentcomm);
MPI_Recv(&K,1,MPI_INT,0,tag,parentcomm,&status);//Recv K
printf(“子%d:k=%d\n”,myrank,k);
K++;

如果(你能把它简化成更简单的事情吗?如果问题是你的衍生过程不能衍生新的过程,试着创建一个可复制的例子来证明这一点,而不需要所有额外的数学。如果你有一个简单的例子,帮助你会容易得多。@WesleyBland-完成,我希望现在没问题。我不确定这里有什么问题。我能够运行它。)代码没有问题。我更改了二进制文件的名称,但是spawn命令有
/child
。否则一切都是一样的。哇,真的吗?也许这与我的虚拟机有关。我很久以前安装了openmpi 1.4。我试着安装一个更新的版本,但这太麻烦了,我似乎无法完成正确。我明天会尝试创建一个干净的虚拟机。如果我在MPI_发送给第二个worker_孩子(我在这里写了注释”//将K+1发送给第二个worker_孩子)之前在worker中放入printf,它会打印。如果我将它放在后面,它不会打印,因为它只是挂在那里。很高兴知道我的代码实际上很好。