- 论坛徽章:
- 0
|
为什么多线程与串行时间相差无几,真心不明白,我能考虑的地方都已经考虑了
我的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);//输出程序运行时间
} |
|