【问题标题】:Rank 2 caused collective abort of all racks等级 2 导致所有机架集体中止
【发布时间】:2016-03-27 06:33:36
【问题描述】:

下面的代码尝试使用mpi 查找数组的最大数量。但是我不断收到以下错误:

工作 47 中的 2 级导致所有级别的集体中止。 rank 2的退出状态:被信号9杀死

谁能告诉我怎么了?

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

int main(int argc , char * argv[])
{
    int myRank , numOfProcesses;
    int source , destination;
    int tag = 0;
    int i = 0, j = 0, k = 0;
    int masterArray[] = {5,6,8,10,12,3,9,-1,3,7};
    int max , globalMax = -100000;
    int flag = 0;

    MPI_Init(&argc, &argv);
    MPI_Status status;
    MPI_Comm_rank(MPI_COMM_WORLD , &myRank);
    MPI_Comm_size(MPI_COMM_WORLD , &numOfProcesses);
    printf("Process : %d \n" , myRank);

    int masterSize = sizeof(masterArray)/sizeof(int);
    //printf("%d \n" , masterSize);
    int slaveSize = masterSize/(numOfProcesses-1);
    //printf("%d \n" , slaveSize);
    int slaveArray[slaveSize];

     if (myRank == 0){

        for (i=1; i<numOfProcesses; i++){
            for (j=0; j<slaveSize; j++){
                slaveArray[j] = masterArray[k];
               // printf("%d \n" , masterArray[k]);
                k++;
            }

           MPI_Send(slaveArray, slaveSize, MPI_INT, i, tag, MPI_COMM_WORLD);
        }


       for (i=1; i<numOfProcesses; i++){
            MPI_Recv(max , 1, MPI_INT, i, tag, MPI_COMM_WORLD, &status);

            if (globalMax < max)
                max = globalMax;
        }
        printf("Global Maximum %d \n" , globalMax);

    }

    else{

        MPI_Recv(slaveArray , slaveSize, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
        max = slaveArray[0];

        for (i=0; i<slaveSize; i++){
                if (slaveArray[i] > max)
                    max = slaveArray[i];
        }
        printf("Max in %d %d \n" , myRank, max);

         MPI_Send(max , 1, MPI_INT, 0, tag, MPI_COMM_WORLD);

    }

 MPI_Finalize();

    return 0;
}

【问题讨论】:

  • 如果masterSize 不能被numProcesses-1 整除会怎样?

标签: c++ c parallel-processing mpi


【解决方案1】:

在 MPI 中发送和接收消息始终通过地址进行。如下:

MPI_Recv(max , 1, MPI_INT, i, tag, MPI_COMM_WORLD, &status);

...

MPI_Send(max , 1, MPI_INT, 0, tag, MPI_COMM_WORLD);

您使用该值。您必须添加&amp; 才能获取地址。

您还应该学会使用适当的集体操作:MPI_ScatterMPI_Reduce

顺便说一句,这一行的顺序也错了:

max = globalMax;

也请学会听你的编译器!任何合理设置下的合理编译器都会警告您将整数作为地址传递。

【讨论】:

    猜你喜欢
    • 2012-12-13
    • 1970-01-01
    • 2015-12-25
    • 2010-11-05
    • 1970-01-01
    • 2013-07-16
    • 2018-02-13
    • 2017-02-09
    • 1970-01-01
    相关资源
    最近更新 更多