Использование OpenMP для распараллеливания быстрой сортировки - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь использовать OpenMP для распараллеливания быстрой сортировки (для массивов с различными целыми числами). У меня уже есть рабочая реализация (я проверил вывод для нескольких потоков, и, кажется, работает). Проблема в том, что я не вижу никакого ускорения, даже для больших массивов, что приводит меня к мысли, что моя реализация не верна. Поскольку фактическая реализация верна, но параллелизм, по-видимому, не дает желаемого ускорения, я покажу только распараллеливание кода:

void parallel_randomized_quicksort(vector<int>& A, int start, int end){
  if ((end-start) is too small){
    run a serial sorting algorithm
  }else{
    pick a random pivot x and partition A around that pivot.
    k = index of x in A
    #pragma omp parallel
    {
      #pragma omp single nowait
      {
        parallel_randomized_quicksort(A,start,k-1);
      }
      #pragma omp single nowait
      {
        parallel_randomized_quicksort(A,k+1,end);
      }
    }
  }
}

Если это правильно, должно быть некоторое ускорение, так как левый и правый разделы могут повторяться параллельно, что является целью моего кода. Почему я не замечаю ускорение?

EDIT: Время выполнения измеряется с помощью:

double start_time = omp_get_wtime();
  parallel_randomized_quicksort(A,0,A.size()-1);
  double time = omp_get_wtime() - start_time;

Массивы являются различными целыми числами. Размеры массивов варьируются от 100 до 1000000. Времена в миллисекундах для меньших массивов и пара секунд для больших. Обычно, если размер массива меньше 32, я использую простой последовательный алгоритм, например сортировку вставкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...