Wpis z mikrobloga

#pytanie z #programowanie #clang #cpp #openmp
Mam bardzo prosty programik w C wykorzystujący OpenMP. Zadaje mu ilość operacji dla pętli i w tej pętli inkrementuje zmienną. Na końcu pokazuje wartość tej zmiennej. Wartość zmiennej powinna być równa ilości iteracji. I tak jest ale w przypadku gdy program jest sekwencyjny. Gdy włączę równoległość to wyniki wychodzą różne i nie dobijają do zadanej ilości operacji. Przykładowo:

[1]
size = 1000
sum = 678

[2]
size = 10000
sum = 5205

Dla mniejszych wartości jest ok. Program idzie na 4 wątkach.
  • 8
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@m4kb0l: @m4kb0l: w uproszczeniu (szczegółów i tak nie pamiętam xd):
proces1 odczytuje aktualną wartość (0), proces2 odczytuje aktualną wartość (0), proces1 inkrementuje i zapisuje nową wartość (1), proces 2 inkrementuje i zapisuje nową wartość (1), wartość wynosi 1 pomimo wykonania dwóch równoległych inkrementacji.

korzystając z współdzielonych danych należy używać sekcji krytycznych. a po za tym żeby równoległość miała sens (czytaj była szybsza) każdy proces powinien być jak najbardziej
  • Odpowiedz
@sosnnaa: to oczywiście będzie działać ale warto zauważyć że w tym konkretnym wypadku będzie się wykonywało dłużej niż program z prostą synchroniczną pętlą
  • Odpowiedz
@sosnnaa: @inplaz: W tym przypadku dość dobrze zadziałała klauzula reduce(+: sum) bez #pragma omp atomic które dawało dobre rezultaty ale przez to program był wolniejszy od wersji sekwencyjnej.
  • Odpowiedz