Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C/C++][MPI] Problem z podziałem na watki

Ostatnio zmodyfikowano 2018-01-15 17:00
Autor Wiadomość
Mat.1995
Temat założony przez niniejszego użytkownika
[C/C++][MPI] Problem z podziałem na watki
» 2018-01-15 05:27:50
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.

C/C++
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 );
   
}
P-168747
DejaVu
» 2018-01-15 17:00:22
Dawno temu opisałem trochę pojęć w dokumentacji: http://cpp0x.pl/dokumentacja​/mpich/116.

MPI:
1. Wyboraź sobie że masz N-komputerów w sieci
2. Wyboraź sobie, że jeden z nich jest komputerem 'głównym'
3. Aby komputer w sieci mógł wykonać obliczenia to musisz mu wysłać najpierw wycinek danych
4. Potem musisz wykonać obliczenia osobno na każdym z komputerów
5. Potem musisz zebrać obliczenia od wszystkich i je scalić
6. Potem prezentujesz wynik.

Te wszystkie etapy zrobisz za pomocą funkcji dostępnych w bibliotece mpich. Kwestia odpowiedniego złożenia aplikacji.

/edit:
Z wikipedii możesz doczytać, że piszesz jedną aplikację i wywołując funkcję biblioteki MPI jesteś w stanie określić która instancja aplikacji to jest. Na podstawie numeru instancji możesz sobie ustalić czy dana aplikacja będzie pełniła rolę hosta czy rolę klienta. Patrz:
[cpp MPI_Comm_size(MPI_COMM_WORLD,&size);   // liczba procesów w grupie zapisywana jest w zmiennej size manual
 MPI_Comm_rank(MPI_COMM_WORLD,&rank);   // rank bieżącego procesu zapisywany jest w zmiennej rank manual
[/cpp]
https://pl.wikipedia.org/wiki​/MPICH
P-168758
« 1 »
  Strona 1 z 1