Witam , na zajęciach z programowania równoległego miałem napisać kod dzielący obrazek 512x512 px na dzwie części (MPI_Scatterv) wykonuje on następnie filtr Laplac'e i łączy te części (MPI_Gaterv) . Z wyniku szukania błędu wnioskuję że jest gdzieś błąd w składni MPI_Scatterv lecz prowadzący zajęcia nie był w stanie mi pomóc... Może ktoś z was widzi błąd w kodzie?

Z góry dziękuję za uwagę.
Pozdrawiam
Wicek

#include <netpbm/pgm.h>
#include <stdio.h>
#include <mpi.h>

int main(int argc, char ** argv) {

        int size,rank;
        int length;
        MPI_Status status;
        char name[80];
        int i;
        double st1,et1,st2,et2;
        gray **image,**image2;
        gray max;
        int tablica[2];
        int tablica1[2];
        int z; // wielkosc obrazka
        int tablica2[2]; //ilosc rows and cols
        int g;
        int cols, rows;
        int x,y;
        FILE * input_file;
        FILE * output_file;
        image2 = pgm_allocarray(512,512);

        MPI_Init(&argc, &argv);
        // note that argc and argv are passed by address

        MPI_Comm_rank(MPI_COMM_WORLD,&rank);
        MPI_Comm_size(MPI_COMM_WORLD,&size); //30
        MPI_Get_processor_name(name,&length);
if(rank==0)
{
        input_file = fopen ("mandrill.pgm","rb");
        pgm_init(&argc,argv);
        image = pgm_readpgm(input_file,&cols,&rows,&max);
        tablica2[0]= cols;
        tablica2[1]= rows;
        MPI_Send(tablica2,2,MPI_INT,1,0,MPI_COMM_WORLD);
}
if(rank==1)
{

MPI_Recv(tablica2,2,MPI_INT,0,0,MPI_COMM_WORLD,&status);
cols= tablica2[0];
rows= tablica2[1];
}
        tablica[0]= ((cols*rows)/2)+rows;
        tablica[1]= ((cols*rows)/2)+rows;
        tablica1[0]= 0;
        tablica1[1]= ((cols*rows)/2)-rows;
        z= ((cols*rows)/2)+rows;

MPI_Scatterv(image,tablica,tablica1,MPI_INTEGER,image2,z,MPI_INTEGER,0,MPI_COMM_WORLD);

/*
if(rank==0)
{
        for (y=1; y<(rows/2);y++)
        for (x=1;x<cols-1; x++)
        image2[y][x] =((-4*image[y][x]+image[y][x+1]+image[y][x-1]+image[y+1][x]+image[y-1][x])+1024)/8;
}

if(rank==1)
{
        for (y=1; y<(rows/2)-1;y++)
        for (x=1;x<cols-1; x++)
        image2[y][x] =((-4*image[y][x]+image[y][x+1]+image[y][x-1]+image[y+1][x]+image[y-1][x])+1024)/8;
}
MPI_Gatherv(image,z,MPI_INT,image2,tablica,tablica1,MPI_INT,0,MPI_COMM_WORLD);



        output_file = fopen("mandrill2.pgm","wb");
        pgm_writepgm (output_file,image2,x,y,max,1);
*/
        MPI_Finalize();
}