Aktywne Wpisy

chudykbr +428
źródło: temp_file3291322690648614519
Pobierz
uncle_freddie +138
Napiszę to m.in po to, żeby miał szansę zamknąć mi mordę bramką: nie rozumiem fenomenu Kamińskiego, dzisiaj sparaliżowany
#mecz
#mecz
Skopiuj link
Skopiuj link
źródło: temp_file3291322690648614519
Pobierz
Regulamin
Reklama
Kontakt
O nas
FAQ
Osiągnięcia
Ranking
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.
http://stackoverflow.com/questions/7798010/openmp-atomic-vs-critical
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
Albo wspomniane wyżej atomic/critical, albo masz omplockt i możesz ręcznie blokować sekcje.
reduce(+: sum)bez#pragma omp atomicktóre dawało dobre rezultaty ale przez to program był wolniejszy od wersji sekwencyjnej.