Я искал способ реализовать 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 с лучшими результатами, но я сам собираюсь сравнить эти методы на практике.
omp parallel
нужно увидеть цикл, который он собирается распараллелить. Как вы объявили, omp распараллелит один фрагмент кода, который не даст никакой выгоды.
Проверьте свои документы на omp parallel
использование.
Чтобы сделать цикл, вам нужно использовать omp parallel for
с заявлением для следующего. То, как у вас это сейчас есть, будет запускать ваш timsort на каждом вашем ядре
думаю, что openMP не достаточно умен, как вы думаете …
если вы хотите сделать параллель для gfx::timsort
ты не можешь сделать это снаружи …
Вы должны добавить этот код в функцию gfx::timsort
#pragma omp parallel for
for(int i=0;i<num;i++)
...
Рядом, shared
является ключевым словом для указания переменной, которую вы не хотите редактировать параллельно