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();
}