免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6398 | 回复: 11
打印 上一主题 下一主题

[Linux] 一个简单的求数组最大值的程序,为什么我的多线程比串行要慢???各位大神速来,跪求 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-03 15:27 |只看该作者 |倒序浏览
为什么多线程与串行时间相差无几,真心不明白,我能考虑的地方都已经考虑了
我的PC是4个core i3 M380, cache结构有三级。
各位大哥,代码如下(复制粘贴即可执行),求指导!


#include "stdio.h"
#include <malloc.h>
#include <time.h>
#include <pthread.h>

int *a;//需要求最大值的数组
int length,thread_num,max;//定义数组长度,线程数
pthread_t *threads;//线程数组
pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;//初始化锁

struct padded_int{//为了消除cache之间的假共享线程私有变量thread_max,定义一个结构体,通过添加一个60的字符数组将其填充之一个CACHE行大小,即64
int thread_max;
char padding[60];
} *private_max;


void *Max(void *id){//各线程执行的MAX函数,将一个数组分成thread_num个段,每个线程执行一段
int tid=(int)id;
int length_per_thread=length/thread_num;//每个线程计算的长度
int start=tid*length_per_thread;
int i;

for(i=start;i<start+length_per_thread;i++){

        if(a[i]>private_max[tid].thread_max) private_max[tid].thread_max=a[i];
}

pthread_mutex_lock(&lock);
if(private_max[tid].thread_max>max) max=private_max[tid].thread_max;
pthread_mutex_unlock(&lock);

printf("%d\n",(int)id);
}

int main(int argc ,char **argv){

        int i;
        length=atoi(argv[1]);
        thread_num=atoi(argv[2]);
        clock_t start,end;//计算程序时间
        double duration;
        start =clock();
        private_max=(struct padded_int*)malloc(sizeof(struct padded_int)*(thread_num));
        a=(int*)malloc(sizeof(int)*(length));
        threads=(pthread_t*)malloc((thread_num)*sizeof(int *));
for (i = 1; i <=length; i++)//按最坏情况生成数组a[],即升序
        {
                a[i] = i;
        }

for(i=0;i<thread_num;i++){
        int ret;
        ret = pthread_create(&threads[i], NULL, Max, (void*)i);
        }

for(i=0;i<thread_num;i++){
                pthread_join(threads[i], NULL);
        }

printf("%d\n",max);
end=clock();
duration =(double) (end- start)/CLOCKS_PER_SEC;
printf("%lf\n",duration);//输出程序运行时间
}

论坛徽章:
0
2 [报告]
发表于 2012-12-03 15:37 |只看该作者
大神们,你们在哪?

论坛徽章:
0
3 [报告]
发表于 2012-12-03 15:52 |只看该作者
在线求解答啊

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
4 [报告]
发表于 2012-12-03 16:09 |只看该作者
有锁, 锁和计算相比, 锁不可忽略, 所以是假并行.

论坛徽章:
0
5 [报告]
发表于 2012-12-03 16:14 |只看该作者
回复 4# linux_c_py_php
把锁的那两行代码注释掉,结果也一样啊

   

论坛徽章:
0
6 [报告]
发表于 2012-12-03 16:18 |只看该作者
回复 4# linux_c_py_php
数组长度比较大,设为五千万,结果也一样

   

论坛徽章:
0
7 [报告]
发表于 2012-12-03 20:33 |只看该作者
你这里即便是5千万的数据比较也很快,创建线程的开销不容忽视。

论坛徽章:
0
8 [报告]
发表于 2012-12-05 09:10 |只看该作者
回复 6# 我叫桃花贼

启动了几个线程?

论坛徽章:
0
9 [报告]
发表于 2012-12-05 10:04 |只看该作者
for(i=0;i<thread_num;i++){
        int ret;
        ret = pthread_create(&threads[i], NULL, Max, (void*)i);
        }

for(i=0;i<thread_num;i++){
                pthread_join(threads[i], NULL);
        }


thread_num是多少?
看起来不会小,而且thread里面还有锁……

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
10 [报告]
发表于 2012-12-06 12:33 |只看该作者
本帖最后由 timespace 于 2012-12-06 12:35 编辑

像CPU bound的代码
1.线程数量不应多于core的数量
2.用了多线程,调度器也不一定会把线程均匀分布到四个core上,用sched_setaffinity强制指定吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP