首页 > 解决方案 > Open MP 中的冒泡排序较慢

问题描述

我在openMP中编写的冒泡排序程序比这个的串行版本慢,这是为什么,我不明白是什么问题。

串行版本大约需要 0.07,并行版本大约需要 0.9 来处理 5000 个元素的数组

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

void swap(int *num1, int *num2)
{
    
    int temp = *num1;
    *num1 =  *num2;
    *num2 = temp;
}

int main (int argc, char *argv[]) {
    int SIZE =5000;
    int A[SIZE];
    for(int i=0;i<SIZE;i++)
    {
        A[i]=rand()%SIZE;
    }
    int N = SIZE;
    int i=0, j=0; 
    int first;
    double start,end;
    start=omp_get_wtime();
        
    #pragma omp parallel reduction( +:first )

    for( i = 0; i < N; i++ )
    {

        first = i % 2; 
        
        #pragma omp parallel for default(none),shared(A,first,N)

        for( j = first; j < N-1; j += 2 )
        {
            
            if( A[ j ] > A[ j+1 ] )
            {
                swap( &A[ j ], &A[ j+1 ] );
            }
            
            
        }
            
    }
    
    
end=omp_get_wtime();
    for(i=0;i<N;i++)
    {
        printf(" %d",A[i]);
    }

printf("\n-------------------------\n Time Parallel= %f",(end-start));
}

标签: c++sortingopenmpbubble-sort

解决方案


您只需要删除该行

 #pragma omp parallel reduction( +:first )

此行是错误的,因为它多次运行算法,但如果您跳过此行,算法将正确并行运行并且使用 openMP 会更快,请查看这些幻灯片


推荐阅读