如下代码为什么在4线程下性能和2线程几乎一样?
我用的是Intel i5的CPU,下面的代码没有线程通信,单线程大约1sec完成,2线程0.6秒左右完成,增加更多的线程无法让代码速度得到提升。我认为是内存的瓶颈作用。如何克服之? 谢谢指教!
#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#define NUM_DATA 50000000
#define THREADS 1
#define BLOCK_LEN NUM_DATA/THREADS
double* data,*data1;
void* work_thread(void* pindex)
{
int index=*reinterpret_cast<int*>(pindex);
for(int j=0;j<5;++j)
{
for(int i=index;i<index+BLOCK_LEN;++i)
data1[i]=1.0/data[i];
data[j]+=0.01;
}
}
void work(void)
{
pthread_t ntid[THREADS];
void* pret;
int index[]={
0,
0+BLOCK_LEN,
0+2*BLOCK_LEN,
0+3*BLOCK_LEN
};
// create threads
for(int i=0;i<THREADS;++i)
{
int error;
error=pthread_create(&ntid[i],NULL,work_thread,&index[i]);
if (error!=0)
{
fprintf(stderr,"Fail to create thread %d\n",i);
exit(0);
}
}
for(int i=0;i<THREADS;++i)
pthread_join(ntid[i],&pret);
}
int main(void)
{
data=(double*) malloc(sizeof(double)*NUM_DATA);
data1=(double*) malloc(sizeof(double)*NUM_DATA);
if (data==NULL)
exit(1);
for(int i=0;i<NUM_DATA;++i)
data[i]=i+0.5;
struct timeval start, end;
gettimeofday(&start, NULL);
work();
gettimeofday(&end, NULL);
printf("%ld\n", ((end.tv_sec * 1000000 + end.tv_usec)
- (start.tv_sec * 1000000 + start.tv_usec)));
double value(0.0);
for(int i=0;i<NUM_DATA;++i)
{
value+=data1[i];
}
printf("%f\n",value);
}