weixin_47977008
2022-04-12 09:13
采纳率: 100%
浏览 50

openmp快速排序多线程比单线程还慢

openmp初学者,尝试了冒泡排序openmp并行,发现在一定数据量的时候多线程比单线程快,我就又尝试了快速排序,但是快速排序无论多大的数据量,总是单线程比多线程快,请各位帮我看看哪里出了问题

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#define MAX 1000000
#define dis 500000
int qusort(int s[],int start,int end) //自定义函数 qusort()
{
int i,j; //定义变量为基本整型
i=start; //将每组首个元素赋给i
j = end; //将每组末尾元素赋给j
s[0]=s[start]; //设置基准值
while(i<j)
{
while(i<j&&s[0]<s[j])
j--; //位置左移
if(i<j)
{
s[i]=s[j]; //将s[j]放到s[i]的位置上
i++; //位置右移
}
while(i<j&&s[i]<=s[0])
i++; //位置左移
if(i<j)
{
s[j]=s[i]; //将大于基准值的s[j]放到s[i]位置
j--; //位置左移
}
}
s[i]=s[0]; //将基准值放入指定位置
if (start<i)
qusort(s,start,j-1); //对分割出的部分递归调用qusort()函数
if (i<end)
qusort(s,j+1,end);
return 0;
}
int a[MAX];
int main(int argc, char* argv[])
{
int thread,length;
printf("快速排序1-输入数据量:");//数据规模
scanf_s("%d",&length);
printf("线程数:");//线程数
scanf_s("%d",&thread);

int m,n;
double ts=0;//m表示次数,ts表示总共时间
printf("请输入循环次数:");
scanf_s("%d",&n);
printf("循环次数为%d",n);
for(m=0;m<n;m++){  //表示循环m次
//printf("输出原始数据:\n");//随机数初始化数据
for(int i=0;i<length;i++){
    a[i]=rand()%length+1;
    //printf("%d,",a[i]);
}
printf("\n");//输出原始数据
omp_set_num_threads(thread);//启动多线程执行
double start,end;
start=omp_get_wtime();//计时
//快速排序

    #pragma omp parallel  
    qusort(a,0,length-1);

end=omp_get_wtime();


/*printf("排序后数据:\n");
for(int i=0;i<length;i++){
    printf("%d,",a[i]);
}
printf("\n");*/
printf("\ntime=%lf\n",end-start);
//ts+=end-start;
    ts+=(end-start);
    printf("\nsum_time=%lf\n",ts);//当前总时间        
}

printf("\naverage_time=%lf\n",ts/m);//m次平均时间
return 0;

}

在数据量为100000时,线程数为1的排序时间为0.012469s,而线程数为2的排序时间为0.020678s。

开始我以为是我的快速排序不够简便,优化了快排的代码,变成了二路快排,但仍然没有效果。

如果我正在做一些非常愚蠢的事情,或者我可以指出问题的更多方面,请告诉我,谢谢大家!

2条回答 默认 最新

相关推荐 更多相似问题