weixin_47977008 2022-04-12 09:13 采纳率: 100%
浏览 185
已结题

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条回答 默认 最新

  • CSDN专家-link 2022-04-12 09:18
    关注

    有没有比较更大数据量级,比如1000万

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月28日
  • 已采纳回答 4月20日
  • 创建了问题 4月12日

悬赏问题

  • ¥15 arcgis中更新地理配准后几个图层分离怎么解决?
  • ¥15 想请教大家关于机器学习的问题
  • ¥15 虚幻UE保存Actor位置失败
  • ¥15 多个.nii合并为.nii.gz格式
  • ¥50 现在需要统计2023年全年 “签收时间(qssj)” 到 “提交时间(tjsj)” 小于半小时的业务量,但是要排除掉周末的时间,同时还要排除中午休息的时间。
  • ¥50 opencv模板匹配为何图像差别大仍然匹配数值高?
  • ¥15 如何成功完成主菜单和分菜单的代码编程C++
  • ¥15 怎样采集或者其它途径拿到全国最新个体工商户数据
  • ¥20 我是一名大学生,想学习java是自学还是报培训班呢
  • ¥15 pycharm该如何爬取网易云歌曲下的评论?