Отправка и получение 2d массива указателей в MPI в c - PullRequest
0 голосов
/ 17 марта 2020

Я хочу отправить массив двухмерных указателей, и каждый процесс добавляет 1 к своему элементу, вот мой код

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

функция для выделения непрерывной памяти

int **alloc_2d_int(int rows, int cols) {
    int *data = (int *)malloc(rows*cols*sizeof(int));
    int **array= (int **)malloc(rows*sizeof(int*));
    int i;
    for (i=0; i<rows; i++)
        array[i] = &(data[cols*i]);

    return array;
}

вот мой основной там есть некоторые логики c внутри, но не имеют ничего с ошибкой

int main(int argc, char * argv[])
{
    int my_rank;        /* rank of process  */
    int p;          /* number of process    */
    int source;     /* rank of sender   */
    int dest;       /* rank of reciever */
    int tag = 0;        /* tag for messages */
    char message[100];  /* storage for message  */
    MPI_Status status;  /* return status for    */
    MPI_Init( &argc, &argv );
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    MPI_Comm_size(MPI_COMM_WORLD, &p);
    int row1,col1;
    int **mat1;
    int i,j,k,val;
//slaves
    if( my_rank != 0)
    {

       MPI_Recv(&row1,1,MPI_INT,dest,tag, MPI_COMM_WORLD,&status);
        MPI_Recv(&col1,1,MPI_INT,dest,tag, MPI_COMM_WORLD,&status);


         MPI_Recv(&(mat1[0][0]),row1*col1,MPI_INT,dest,tag, MPI_COMM_WORLD,&status);
        for (i=0;i<row1;i++){
            for (j=0;j<col1;j++){
                mat1[i][j]++;
            }
        }
    }

MPI_Send(&(mat1[0][0]),row1*col1,MPI_INT,dest,tag,MPI_COMM_WORLD);

//Master work
else
    {
     //take a matrix from user and it works fine

     for (source=1; source<p; source++)
            {
                    MPI_Send(&row1,1,MPI_INT,source,tag,MPI_COMM_WORLD);
                MPI_Send(&col1,1,MPI_INT,source,tag,MPI_COMM_WORLD);
                MPI_Send(&(mat1[0][0]),row1*col1,MPI_INT,source,tag,MPI_COMM_WORLD);



            }

 for (source=1; source<p; source++)
            {
                MPI_Recv(&rows,1,MPI_INT,source,tag, MPI_COMM_WORLD,&status);
                MPI_Recv(&counter,1,MPI_INT,source,tag, MPI_COMM_WORLD,&status);
                MPI_Recv(&(mat1[0][0]),row1*col1,MPI_INT,source,tag, MPI_COMM_WORLD,&status);

                printf("%d   %d\n",counter,rows);

            }

            for(i=0; i<row1; i++)
            {
                for(j=0; j<col1; j++)
                {
                    printf("%d  ",mat1[i][j]);
                }
                printf("\n");

            }

        }


    }

    /* shutdown MPI */
    MPI_Finalize();
    return 0;
}   

, когда я запускаю этот код с 4-мя процессами, это дает мне эту ошибку
ранг 2 i в задании 19 статус ранга 2: убит сигналом 9
ЛЮБЫЕ СОВЕТЫ

1 Ответ

0 голосов
/ 18 марта 2020

Я пытался запустить вашу программу, но очень трудно заставить ее работать, потому что фигурные скобки повсюду и поэтому не только не будет компилятор кода, но и логика c не совсем понятна. Тем не менее, похоже, что причина вашей ошибки в том, что ненулевые ранги выполняют только одну отправку, содержащую полную матрицу, обратно на ранг 0. Однако ранг 0 выдает три приема: для одного целого (дважды), затем для матрица. Первое получение для единственного целого соответствует отправке для полной матрицы, поэтому программа завершается сбоем, так как имеется переполнение буфера приема.

...