Параллельная qsort с использованием openMP

0

Я пытаюсь распараллелить функцию qsort() в c++ с помощью openMP, но у меня есть некоторые проблемы. Для всех, для большого количества элементов для сортировки (ex: V = 1000) qsort вообще не работает, я никогда не выхожу из этой функции (бесконечный цикл). Затем я замечаю, что моя параллельная версия qsort намного медленнее, чем серийная. Кто-нибудь может мне помочь? Вот код: https://dpaste.de/EaH0.

здесь среднее время, когда kruscalP является параллельной версией: Изображение 174551 thanks

  • 1
    можешь показать нам какой-нибудь код? мы не можем видеть, что вы делаете неправильно.
  • 0
    вот пример кода: dpaste.de/A2p1 этот алгоритм упорядочивает ребра графа относительно их весов
Показать ещё 4 комментария
Теги:
parallel-processing
openmp
quicksort

1 ответ

1
Лучший ответ

В вашем коде есть несколько условий гонки, когда вы пишете 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;
        }
    }
}

То же самое относится к следующему циклу. Если вы хотите сделать это эффективно, вам придется изменить свой алгоритм. Возможно, рассмотрим сортировку слияния.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню