CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Open MP - Zrównoleglenie zagnieżdżonej pętli.

Open MP - Zrównoleglenie zagnieżdżonej pętli.

dział ogólny

Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez Giewont » wtorek, 11 grudnia 2012, 14:05

Witam.

Próbuję zrównoleglić taką oto pętlę:

KOD cpp:     UKRYJ  
 for (j=0; j < n; j++)  
        for (i=0; i < j; i++)
            for (k=0; k < n; k++)
                                 R[i][j] = R[i][j] + A[k][j]*Q[k][i];
 


poprzez dodanie dyrektywy:

KOD cpp:     UKRYJ  
#pragma omp parallel for private(j, i, k) shared (A, Q, R)
 


A, Q oraz R to macierze (tablice typu double).
Niestety operacja zrównoleglona daje bezsensowne wyniki. Patrzę na to i ciągle nie widzę dlaczego...
dodam, że jestem początkujący w OpenMP - może ktoś mógłby mnie oświecić w czym jest problem ?

Pozdrawiam.
Avatar użytkownika
Giewont
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): niedziela, 23 stycznia 2011, 11:37
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: Borland C++ Builder 6
Gadu Gadu: 0
    Windows 7Firefox

Re: Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez Mironas » wtorek, 11 grudnia 2012, 14:25

Nie znam się na OpenMP, ale jeśli obliczenia wewnątrz danej pętli są zależne od obliczeń w innej pętli to czy można je wykonywać w oddzielnym wątku? Tym bardziej, że w Twoim przykładzie sterowanie pętlą wewnętrzną jest zależne od iteracji pętli zewnętrznej. Nie wydaje mi się aby to było możliwe.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez Cyfrowy Baron » wtorek, 11 grudnia 2012, 15:58

Środowisko Embarcadero RAD Studio i wcześniejsze CodeGear i Borland nie kompilują programu z OpenMP, więc te dyrektywy nic nie znaczą, bo można sobie tworzyć dowolne.

Spis kompilatorów, które to obsługują znajdziesz na oficjalnej stronie OpenMP: http://openmp.org/wp/openmp-compilers/
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez Giewont » wtorek, 11 grudnia 2012, 19:12

Cyfrowy Baron napisał(a):Środowisko Embarcadero RAD Studio i wcześniejsze CodeGear i Borland nie kompilują programu z OpenMP, więc te dyrektywy nic nie znaczą, bo można sobie tworzyć dowolne.


Zgadza się, dlatego też kod ten kompilowałem w Dev C++ obsługującym OpenMP. Dodam tylko, że inną pętlę (mnożenie macierzy) udało mi się pomyślnie zrównoleglić i faktycznie wykonywała się na 4 wątkach.
Tutaj po prostu liczyłem może, że ktoś spostrzeże błąd, którego ja nie widzę...

Pozdr.
Avatar użytkownika
Giewont
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): niedziela, 23 stycznia 2011, 11:37
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: Borland C++ Builder 6
Gadu Gadu: 0
    Windows 7Firefox

Re: Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez Cyfrowy Baron » środa, 12 grudnia 2012, 03:04

MIronas już ci odpowiedział. Zagnieździłeś pętle wewnątrz pętli, więc tego nie da się wykonać w kilku wątkach, gdyż pętle niżej są zależne od pętli wyżej i nie mogą być wykonywane asynchronicznie. Zastanów się co by było gdyby pętla i wykonała się szybciej niż pętla j?! Powstałby galimatias...

Giewont napisał(a):Niestety operacja zrównoleglona daje bezsensowne wyniki.


Może właśnie doszło do tego, że te pętle jednak wykonują się asynchronicznie i dlatego wynik jest pozbawiony sensu, gdyż pętle przestają być współzależne i każda robi swoje nie czekając na pozostałe.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez polymorphism » środa, 12 grudnia 2012, 11:08

Zastanów się co by było gdyby pętla i wykonała się szybciej niż pętla j?! Powstałby galimatias...

Heh, co by nie mówić, pętla i zawsze będzie wykonała się szybciej od pętli j, niezależnie od tego, czy użyjesz OpenMP, czy nie. W tym przypadku galimatiasu nie będzie, bo poszczególne iteracje j nie są od siebie zależne ;)

OP mógłby sprecyzować te "bezsensowne wyniki".
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez Cyfrowy Baron » środa, 12 grudnia 2012, 11:15

Owszem, ale co jeśli pętla j wykona się szybciej od i, bo będą działały niezależnie od siebie? Poza tym chodzi raczej o to co jest wpisywane do elementów tablicy R, jeżeli pętle działają niezależnie od siebie, to wyniki mogą być losowe, zależne od tego, w jakiej pozycji znajduje się dana pętla.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez polymorphism » środa, 12 grudnia 2012, 11:48

Owszem, ale co jeśli pętla j wykona się szybciej od i, bo będą działały niezależnie od siebie?

Nie ma takiej opcji. Poszczególne iteracje j są rozdzielane na oddzielne wątki (pulę wątków), i jeśli zdarzy się tak, że wszystkie iteracje będą rozdzielone, to pętla będzie czekać na ich zakończenie (bariera). Zatem nie ma możliwości, żeby pętla j skończyła się przed jej iteracjami.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez Mironas » środa, 12 grudnia 2012, 12:08

polymorphism napisał(a):jeśli zdarzy się tak, że wszystkie iteracje będą rozdzielone, to pętla będzie czekać na ich zakończenie (bariera)

To jaki jest sens rozdzielania tego na osobne wątki w tym konkretnym przykładzie?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez polymorphism » środa, 12 grudnia 2012, 12:45

Taki sens, że jakaś tam grupa iteracji może być wykonana równocześnie, co przy platformach wieloprocesorowych czy wielordzeniowych może znacznie przyspieszyć wykonanie. Na maszynie z jednym CPU nie sądzę żeby zastosowanie wielowątkowości w tym przypadku cokolwiek zmieniło na korzyść.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez Mironas » środa, 12 grudnia 2012, 13:00

polymorphism napisał(a):Taki sens, że jakaś tam grupa iteracji może być wykonana równocześnie[...]

Miałem na myśli pytanie czy jest sens rozdzielania na oddzielne wątki tego konkretnego kodu podanego przez Giewonta. Nawet jeśli miałby być wykonywanie na maszynie wieloprocesorowej (albo wielordzeniowej). Bo jeśli poszczególne wątki i tak muszą czekać na wykonanie innych, to chyba nie ma to sensu.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez Cyfrowy Baron » środa, 12 grudnia 2012, 13:14

Skoro w tym przypadku pętle muszą czekać, to wielowątkowość nie ma sensu, gdyż pętle i tak muszą być wykonane po kolei. Co innego gdyby program miał wykonać działania w dwóch niezależnych od siebie pętlach i żadna pętla nie musiałaby czekać na pozostałe.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez polymorphism » środa, 12 grudnia 2012, 13:22

@Mironas, pisałem właśnie o tym konkretnym przypadku. I nie wątki muszą czekać na siebie, tylko pętla j czeka na wykonanie wszystkich iteracji oddelegowanych do innych wątków.

Bardziej obrazowo. Typowa pętla (w nawiasach numery iteracji):
KOD cpp:     UKRYJ  
start --> (1) --> (2) --> (3) --> (4) --> (5) --> koniec


Pętla z paralelizacją:
KOD cpp:     UKRYJ  
        --> (1) --> (3) --> (5) -->
start -|                            |- koniec
        --> (2) --> (4) ---------->
 
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez Cyfrowy Baron » środa, 12 grudnia 2012, 13:49

Nie pasuje do tego konkretnego przypadku, gdyż pętle muszą być wykonane po kolei. Pętla i jest zależna od j i < j
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Open MP - Zrównoleglenie zagnieżdżonej pętli.

Nowy postprzez polymorphism » środa, 12 grudnia 2012, 14:26

No i co z tego? Przecież na czas działania pętli i zmienna j jest stała (wątek dostaje kopię tej zmiennej).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 13 gości

cron