Cześć,
próbuję zrównoleglić merge sorta używając open MP. Zamysł jest taki że dzielę pierwotną tablicę na tyle tablic ile chce wykorzystać wątków i na tych podtablicach w kazdym watku juz klasyczny mergesort - no i potem scalam. Nie ważne czy to wydajna metoda czy nie - ale nie w tym rzecz. Wyłączam nawet dla testów końcowe scalanie. A więc w rzeczywistości na kilku wątków jest mniej roboty (bo nie scalą ostatniej iteracji) niż dla wątku jednego.
Poniżej interesujący kawałek
double* divTab;
#pragma omp parallel private(divTab)
{
int left = omp_get_thread_num()*(size/threadNum);
int right = omp_get_thread_num() == threadNum - 1 ? size-1 : (omp_get_thread_num()+1)*size/threadNum)-1;
divTab = copy(tab, left, right);
mergesort(divTab, 0, right-left);
// mergesort(tab, left, right);
}
Ale w czym jest problem.
Jeśli uruchamiam na 8 wątkach (8 rdzeni) jest niewielkie przyśpieszczenie w stosunku do 1 wątku.
Co ciekawe dla 1 wątku:
-przez pierwsze kilkanascie sekund jest obciążenie procka 100% (a więc jeden rdzenie zużywany na całego)
-przez kolejne kilkanascie sekund jest obciążenie procka 80->50 %
Dla 8 wątków
-przez pierwsze kilka! sekund jest obciążenie procka 350-500 % (może nie na maksa ale widać że rdzenie "pracują")
-przez kolejne naście sekund obciążenie procka jest 50->20 %
Co jescze bardziej ciekawe:
jak uruchomie programik na lapku - 2 dość słabe rdzenie
To różnica między czasem na 1 wątku a na 2 wątkach jest już hmmm... akceptowalna
Nie rozumiem tego ogromnego spadku wydajności pracy do nawet 20% ? PRzecież tam nie ma żadnej synchronizacji. Nic na nic nie powinno czekać.
Będę wdzieczny za jakieś podpowiedzi czemu się tak dzieje