Почему моя параллельная быстрая сортировка OpenMP намного медленнее, чем последовательная быстрая сортировка?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Почему моя параллельная быстрая сортировка OpenMP намного медленнее, чем последовательная быстрая сортировка?

Сообщение Гость »


Я скомпилировал с помощью VSCode G++ -fopenmp в Windows. В настоящее время я пытаюсь доказать, что параллельная быстрая сортировка действительно быстрее, чем последовательная быстрая сортировка, но безуспешно. Я изменил количество потоков на 2 (уменьшив возможные накладные расходы), а также изменил количество генерируемых чисел (10,100,10000,100000), но все они не работают. Ниже показано время результата для 10 000 данных (что даже близко друг к другу... оно примерно в 500 раз медленнее). параллельное время: 4,555 последовательное время: 0,0071298

Ниже приведены некоторые фрагменты кода, вот полный код.

Раздел:

intpartition(vector &data, int p, int r){ int Pivot = данные [p]; интервал слева = р; интервал справа = г; в то время как (слева < справа) { while (left < r && data[left] = 0 && data[right] > Pivot) --right; if (слева < справа && слева = 0) { std::swap(данные[слева], данные[справа]); } } if (слева < справа && слева = 0) { std::swap(данные[слева], данные[справа]); } данные[p] = данные[право]; данные [справа] = точка поворота; вернуться направо; } Параллельная быстрая сортировка:

void ParallelQuickSort (vector &dataList, int nLower, int nUpper) { если (nLower < nUpper) { int nSplit = раздел (dataList, nLower, nUpper); omp_set_num_threads (2); #pragma omp параллельные разделы { Раздел #pragma omp ParallelQuickSort (dataList, nLower, nSplit - 1); Раздел #pragma omp ParallelQuickSort(dataList, nSplit + 1, nUpper); } } } Последовательная быстрая сортировка

void SerialQuickSort(vector &dataList, int nLower, int nUpper) { если (nLower < nUpper) { int nSplit = раздел (dataList, nLower, nUpper); SerialQuickSort (dataList, nLower, nSplit - 1); SerialQuickSort (dataList, nSplit + 1, nUpper); } } Функции для измерения времени выполнения/запуска, описанные выше (не уверен, что моя проблема как-то связана с этим, поэтому решил просто загрузить это сюда):

void start_parallel_quicksort(vector &vec,double &parallel_run_time) { двойной параллельный_start_time; Parallel_start_time=omp_get_wtime(); #pragma omp параллель { #pragma omp сингл nowait ParallelQuickSort(vec,0,VEC_SIZE-1); } Parallel_run_time = omp_get_wtime ()-parallel_start_time; } void start_serial_quicksort(vector &vec, продолжительность &serial_run_time) { auto series_start_time = high_solve_lock::now(); SerialQuickSort(vec,0,VEC_SIZE-1); auto series_end_time=high_solve_lock::now(); Serial_run_time = серийное_конечное_время-serial_start_time; } Я был бы очень признателен, если бы кто-нибудь помог мне в этом. Я искал и пробовал все способы, которые смог найти в stackoverflow, но безрезультатно — ни у кого не было такого огромного разрыва между обоими методами. Заранее спасибо!
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»