многопоточность — Использование OpenMP в C ++ с алгоритмом Timsort

Я искал способ реализовать Timsort для C ++ (Реализация найдена на Github) с многопоточностью, и я попытался использовать в этом процессе.
Я уверен, что использую правильные флаги компилятора, но всякий раз, когда я пытаюсь использовать Timsort, как я делаю ниже:

#pragma omp parallel shared(DataVector)
{
gfx::timsort(DataVector.begin(), DataVector.end(), comp_1);
}

Примечание: сортируемые данные — это вектор, содержащий строки отдельных слов, и я использую свой собственный компаратор.

Кажется, что сортировка занимает столько же времени, сколько требуется для запуска без использования OpenMP. Используя соответствующие включения для хронографа и т. Д., Я рассчитал значения, которые в среднем находились в пределах 0,01 секунды друг от друга, колеблясь около 1,24 секунды для моего вида.

Есть ли причина, по которой потоки не работают с моим методом сортировки, или это проблема с тем, как я реализую OpenMP?

Обратите внимание на цель: я также использовал __gnu_parallel :: sort с лучшими результатами, но я сам собираюсь сравнить эти методы на практике.

2

Решение

omp parallel нужно увидеть цикл, который он собирается распараллелить. Как вы объявили, omp распараллелит один фрагмент кода, который не даст никакой выгоды.

Проверьте свои документы на omp parallel использование.

Чтобы сделать цикл, вам нужно использовать omp parallel for с заявлением для следующего. То, как у вас это сейчас есть, будет запускать ваш timsort на каждом вашем ядре

1

Другие решения

думаю, что openMP не достаточно умен, как вы думаете …
если вы хотите сделать параллель для gfx::timsort ты не можешь сделать это снаружи …
Вы должны добавить этот код в функцию gfx::timsort

#pragma omp parallel for
for(int i=0;i<num;i++)
...

Рядом, shared является ключевым словом для указания переменной, которую вы не хотите редактировать параллельно

0

По вопросам рекламы [email protected]