OpenMP - zrównoleglenie sita Eratostenesa

0

Witam, czy ktoś mógłby wskazać mi gdzie robię błąd w tym kodzie:

for(licznik = 2; licznik <= granica; licznik++)
    {
        if(tablica[licznik] == false) continue;
		#pragma omp parallel for shared(wymiar, tablica, licznik) private(j)
        for(j=2*licznik; j<=wymiar; j=j+licznik) tablica[j] = false;
    }

Mój problem polega na tym, że dla 1 wątku program wykonuje się 9,9 sekundy a dla 8 wątków 9,2 sekundy, dla tablicy o wielkości 500000000. Rozumiem, że program nie będzie działał 8 razy szybciej ale przyspieszenie o 0,7s to chyba trochę mało. Uruchamiane na AMD FX 8150. Czy ktoś mógłby powiedzieć gdzie robię błąd?

0

Prawdopodobnie operacje wykonywane są na tyle szybko, że w tym wypadku decydujące znaczenia dla ogólnego czasu wykonywania ma czas tworzenia wątków. Poza tym ten zewnętrzny for nadal wykonuje się sekwencyjnie, tzn. dopóki jedna iteracja się nie skończy to nie jest liczona następna i myślę, że tutaj bym też szukał przyczyny, zwłaszcza, że dla pewnych wartości licznika (nie wiem jak duża są granica i wymiar) ilość iteracji w wewnętrznej pętli jest niewielka i jak napisałem w pierwszym zdaniu, w takim wypadku tworzenie wątków jest dużo bardziej czasochłonne niż same operacje.

0

A czy działa poprawnie po tym "zrównolegleniu"?

0

Ok tłumaczę co i jak: mam tablicę typu bool 500000000 jeśli t[i] == true to "i" jest pierwsze.
Pierwsza pętla idzie po indeksach i -> druga pętla wykreśla wszystkie wielokrotności i-tej wartości chyba że i-ta wartość już jest false wtedy skaczemy do następnej i-tej wartości, dlatego myślałem żeby równolegle wykonać wykreślanie wielokrotności a nie próbować równolegle wykonywać pierwszą pętle bo mógłbym mieć sytuację że jeden wątek zacznie wykreślać wielokrotność dwójki a następny wielokrotność czwórki (chociaż to przejście powinno być pominięte).

@_13th_Dragon Dla 100 elementowej tablicy działa poprawnie, dla 500000000 elementowej wyrywkowo sprawdzałem z jakiegoś zakresu i działa poprawnie. Nie wiem czy forma "zrównoleglić" coś jest poprawna, więc jeśli nie jest wybacz błąd :)

0

Przepraszam, zobaczyłem coś czego w kodzie nie ma :D
Zastanów się co próbujesz "zrównoleglić", otóż tylko to: tablica[j]=false;
Podpatrz w asemblerze jaka to część kodu, założę się że troszeczkę więcej niż 0.7/9.9

0

O_o ale wstyd... dopiero teraz to zauważyłem. Dzięki Ci _13th_Dragon za wyciągnięcie z niewiedzy. Miłosierny Adminie proszę skasuj ten temat.

1 użytkowników online, w tym zalogowanych: 0, gości: 1