Witam pisze projekt na studia terminy gonią sesja coraz bliżej ,a ja się głowie.
Nie do końca rozumiem zasadę działania tego cuda , na dole daje kod jeden z funkcji.
ogółem program ma pobierać dane obrazu formatu PPM tablice RGB dzielić na 4 watki i każdy z nich ma
przetworzyć swoja cześć dużej tablicy. A później mam porównać to z podejściem klasycznym.
Program pisany bez MPI poszedł bezproblemowo ,ale tu już mam problem.
Zrobiłem tak jak zrozumiałem stworzyłem tablice (np. R_MPI) rozmiaru 1/4 tablicy dużej (np. R) danego koloru
później za pomocą funkcji
MPI_Scatter
podzieliłem Dużą tablice miedzy watki "R" przepisując do tablicy R_MPI.
Później dodałem pętle wykonująca obliczenia zmiany wartości pikseli,
(z tego co zrozumiałem ,a chyba błędnie ta funkcja powinna wykonać się w każdym wątku dla swojej części tablicy)
a na koniec ponownie zapisałem małe tablice do dużej za pomocą funkcji
MPI_Gather
.
po uruchomieniu programu z konsoli za pomocą polecenia
mpiexec Projekt1.exe
obraz wynikowy był identyczny co obraz wejściowy po dodaniu flagi do polecenia
mpiexec - n 1 Projekt1.exe
zmieniła się 1/4 obrazu jak dalem -n 2 znów obraz był bez zmian tak jak by zamiast pracować na 4 częściach pracował na 1.
I tu jest problem jak zrobić aby funkcja zadziałała dla całego obrazu.
void konturowanie( ob * obrazek )
{
int i, j;
int rank = 0, numOfProcess = 0;
MPI_Comm_rank( MPI_COMM_WORLD, & rank );
MPI_Comm_size( MPI_COMM_WORLD, & numOfProcess );
obrazek->R_MPI = stworz( obrazek->R_MPI,( obrazek->wymx * obrazek->wymx ) / 4, 1 );
obrazek->G_MPI = stworz( obrazek->R_MPI,( obrazek->wymx * obrazek->wymx ) / 4, 1 );
obrazek->B_MPI = stworz( obrazek->R_MPI,( obrazek->wymx * obrazek->wymx ) / 4, 1 );
MPI_Scatter( obrazek->R,( obrazek->wymx * obrazek->wymx ) / 4, MPI_INT, obrazek->R_MPI,( obrazek->wymx * obrazek->wymx ) / 4, MPI_INT, 0, MPI_COMM_WORLD );
MPI_Scatter( obrazek->G,( obrazek->wymx * obrazek->wymx ) / 4, MPI_INT, obrazek->G_MPI,( obrazek->wymx * obrazek->wymx ) / 4, MPI_INT, 0, MPI_COMM_WORLD );
MPI_Scatter( obrazek->B,( obrazek->wymx * obrazek->wymx ) / 4, MPI_INT, obrazek->B_MPI,( obrazek->wymx * obrazek->wymx ) / 4, MPI_INT, 0, MPI_COMM_WORLD );
for( j = 0; j <( obrazek->wymx * obrazek->wymy ) / 4 - obrazek->wymx; j++ )
{
obrazek->R_MPI[ j ] = abs( obrazek->R_MPI[ j + 1 ] - obrazek->R_MPI[ j ] ) + abs( obrazek->R_MPI[ j + obrazek->wymx + 1 ] - obrazek->R_MPI[ j + obrazek->wymx ] );
obrazek->G_MPI[ j ] = abs( obrazek->G_MPI[ j + 1 ] - obrazek->G_MPI[ j ] ) + abs( obrazek->G_MPI[ j + obrazek->wymx + 1 ] - obrazek->G_MPI[ j + obrazek->wymx ] );
obrazek->B_MPI[ j ] = abs( obrazek->B_MPI[ j + 1 ] - obrazek->B_MPI[ j ] ) + abs( obrazek->B_MPI[ j + obrazek->wymx + 1 ] - obrazek->B_MPI[ j + obrazek->wymx ] );
}
MPI_Gather( obrazek->R_MPI,( obrazek->wymx * obrazek->wymx ) / 4, MPI_INT, obrazek->R,( obrazek->wymx * obrazek->wymx ) / 4, MPI_INT, 0, MPI_COMM_WORLD );
MPI_Gather( obrazek->G_MPI,( obrazek->wymx * obrazek->wymx ) / 4, MPI_INT, obrazek->G,( obrazek->wymx * obrazek->wymx ) / 4, MPI_INT, 0, MPI_COMM_WORLD );
MPI_Gather( obrazek->B_MPI,( obrazek->wymx * obrazek->wymx ) / 4, MPI_INT, obrazek->B,( obrazek->wymx * obrazek->wymx ) / 4, MPI_INT, 0, MPI_COMM_WORLD );
free( obrazek->R_MPI );
free( obrazek->G_MPI );
free( obrazek->B_MPI );
}