红联Linux门户
Linux帮助

pthread编程与多核的问题

发布时间:2008-07-28 21:45:58来源:红联作者:linuxdog
两个大矩阵(1000*1000)相乘的运算问题,用两个线程(一个计算前N/2的数据,一个计算后N/2的数据,保证没有重叠)来计算跟使用一个线程计算(串行)的时间竟然是差不多的。

cpu是双核的....
------------------------------

理解中,2个线程的运算时间应该差不多是串行的一半啊.因为两个线程分别被调到2个cpu核中分别去运行了啊.内核中使用的是NPTL线程库。

结果怎么会这样?

(程序设计应该没有问题.)
---------------------------------------------------
#include
#include
#include
#include

const int MATRIX_SIZE=1000; //矩阵大小
typedef int DataType;
DataType **matrixA,**matrixB,**result;

void InitMatrix(DataType ***matrix) //分配二位数组的空间并初始化
{
*matrix=(DataType**)malloc(sizeof(DataType*)*MATRIX_SIZE);
int i,j;
for(i=0; i (*matrix)[i]=(DataType*)malloc(sizeof(DataType)*MATRIX_SIZE);

srand((unsigned)time(NULL));
for(i=0; i for(j=0; j (*matrix)[i][j]=rand()%100;
}
void FreeMatrix(DataType **matrix)
{
int i;
for(i=0; i free(matrix[i]);
free(matrix);
}

//串行
void Calculate()
{
int i,j,k;
double start, finish;
start=(double)clock();
for(i=0; i for(j=0; j {
result[i][j]=0;
for(k=0; k result[i][j]+=matrixA[i][k]*matrixB[k][j];
}
finish=(double)clock();

//printf("total time=%.4lf\n", (finish-start)/CLOCKS_PER_SEC);
}


//并行
const int NumThread=2; //线程个数

void* threadhandle(void *dum)
{
int i,j,k;
int start=*((int*)dum);
int stop=start+500;
for(i=start; i for(j=0;j {
result[i][j]=0;
for(k=0; k result[i][j]+=matrixA[i][k]*matrixB[k][j];
}
}

//并行计算:创建2个线程
void Calculate_Parallel()
{
int i;
pthread_t pid[NumThread];
double start, finish;
start=(double)clock();
for(i=0; i pthread_create(&(pid[i]), NULL, threadhandle,&i);
finish=(double)clock();
pthread_join(pid[i], NULL);
printf("total time=%.4lf\n", (finish-start)/CLOCKS_PER_SEC);
}


int main()
{

InitMatrix(&matrixA);
InitMatrix(&matrixB);
InitMatrix(&result);

Calculate();
Calculate_Parallel();

FreeMatrix(matrixA);
FreeMatrix(matrixB);
FreeMatrix(result);
}
文章评论

共有 1 条评论

  1. faniyou 于 2008-07-29 15:18:42发表:

    使用 pthread_join(pid, NULL); 将导致线程结束前无法返回
    所以程序的最终结果是顺序执行,没有用到多线程并行处理的优势,所以时间一样。