Я пытаюсь распараллелить функцию qsort() в c++ с помощью openMP, но у меня есть некоторые проблемы. Для всех, для большого количества элементов для сортировки (ex: V = 1000) qsort вообще не работает, я никогда не выхожу из этой функции (бесконечный цикл). Затем я замечаю, что моя параллельная версия qsort намного медленнее, чем серийная. Кто-нибудь может мне помочь? Вот код: https://dpaste.de/EaH0.
здесь среднее время, когда kruscalP является параллельной версией: thanks
В вашем коде есть несколько условий гонки, когда вы пишете A
, exch0
и exch1
которые являются общими. Мало того, что это может ухудшить производительность, скорее всего, даст неправильный результат. К сожалению, вы должны использовать критический раздел, чтобы исправить это, что также может повредить производительность, но, по крайней мере, это даст правильный результат.
#pragma omp for
for (i = 0; i < N-1; i += 2) {
#pragma critical
{
if (A[i].weight > A[i+1].weight) {
temp = A[i];
A[i] = A[i+1];
A[i+1] = temp;
exch0 = 1;
}
}
}
То же самое относится к следующему циклу. Если вы хотите сделать это эффективно, вам придется изменить свой алгоритм. Возможно, рассмотрим сортировку слияния.