【发布时间】:2021-08-21 14:15:58
【问题描述】:
我在openMP中写的冒泡排序程序比这个的串行版本慢,这是为什么,我不明白是什么问题。
对于 5000 个元素的数组,串行版本大约需要 0.07,并行版本大约需要 0.9
#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));
}
【问题讨论】:
-
可能你使用的样本太小,不值得花时间在电脑上创建多线程,尝试使用 500000 个元素
-
请注意,在冒泡排序中,第二次迭代依赖于第一次迭代,依此类推。所以像你写的那样幼稚的颚化是行不通的。
-
您的程序存在数据竞争,您已共享(A)但您在并行区域中对其进行了修改
-
此外,您有嵌套并行性,您可能想要#pragma omp for 而不是#pragma omp parallel for
-
并行并不是让您的代码更快的魔法。大多数排序算法都不容易并行化或不能提供良好的并行性能。这就是为什么在并行计算中使用特殊的排序算法(它们在连续使用时可能表现不佳)。如果您想学习 OpenMP 排序不是最好的选择。如果您想要更快的排序,冒泡排序不是您要搜索的算法。
标签: c++ sorting openmp bubble-sort