У меня есть реализация алгоритма параллельной пузырьковой сортировки ( Сортировка транспонирования нечетного-четного ) в C, используя OpenMP. Однако после того, как я протестировал его, он медленнее, чем серийная версия (примерно на 10%), хотя у меня 4-ядерный процессор (2 реальных x 2 из-за гиперпоточности Intel). Я проверил, действительно ли используются ядра, и могу видеть их на 100% при запуске программы. Поэтому я считаю, что ошибся в реализации алгоритма.
Я использую Linux с ядром 2.6.38-8-generic.
Вот как я компилирую:
gcc -o bubble-sort bubble-sort.c -Wall -fopenmp
или
gcc -o bubble-sort bubble-sort.c -Wall -fopenmp
для серийной версии
Вот как я запускаю:
./ bubble-sort
#include
#include
#include
#include
int main()
{
int i, n, tmp, *x, changes;
int chunk;
scanf("%d ", &n);
chunk = n / 4;
x = (int*) malloc(n * sizeof(int));
for(i = 0; i < n; ++i)
scanf("%d ", &x[i]);
changes = 1;
int nr = 0;
while(changes)
{
#pragma omp parallel private(tmp)
{
nr++;
changes = 0;
#pragma omp for \
reduction(+:changes)
for(i = 0; i < n - 1; i = i + 2)
{
if(x[i] > x[i+1] )
{
tmp = x[i];
x[i] = x[i+1];
x[i+1] = tmp;
++changes;
}
}
#pragma omp for \
reduction(+:changes)
for(i = 1; i < n - 1; i = i + 2)
{
if( x[i] > x[i+1] )
{
tmp = x[i];
x[i] = x[i+1];
x[i+1] = tmp;
++changes;
}
}
}
}
return 0;
}
Дальнейшее редактирование:
Кажется, теперь он работает хорошо после того, как я сделал изменения, которые вы предложили. Он также неплохо масштабируется (я тестировал также 8 физических ядер -> потребовалось 21 с для набора из 150 тыс. Чисел, что намного меньше, чем на одном ядре). Однако, если я сам установил переменную среды OMP_SCHEDULE, производительность снизится ...