C Параллельная пузырьковая сортировка OpenMP

У меня есть реализация алгоритма параллельной пузырьковой сортировки ( Сортировка транспонирования нечетного-четного ) в 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 out_10000

#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, производительность снизится ...

5
задан Dan Lincan 3 November 2011 в 23:17
поделиться