现代的线程库允许不同的线程运行在不同的处理器芯片上,从而实现真正意义上的并行。换句话说,如果你的机子是单核的,用多线程也没不会提高执行效率。
我的电脑是多核的,并行计算耗时0.56秒,但按照常规的串行计算方法只需要0.07秒。
分析一下原因,在我的程序里计算200×300和300×200的两个矩阵的乘积,分了300个子线程去分头完成。线程数太多,每个线程的工作量太小,CPU把时间都花在线程调度上了,所以并行的结果反而还不如串行。
并行程序代码:
#include<stdio.h>
#include<time.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<memory.h>
/*定义矩阵中元素的上限,避免相乘后溢出*/
#define RANGE 100
/*矩阵A有M行N列,矩阵B有N行M列*/
#define M 200
#define N 300
void gene_matrix();
void read_matrix();
int matrixA[M][N];
int matrixB[N][M];
int arr[M][M][N];
void *func(void *arg);
main()
{
gene_matrix(); //用随机数产生两个待相乘的矩阵,并分别存入两个文件中
read_matrix(); //从两个文件中读出数据赋给matrixA和matrixB
clock_t start=clock(); //开始计时
int res[M][N]={ 0}; //保存矩阵相乘的结果。非全局变量一定要显示初始化为0,否则为随机的一个数
int i,j,k;
pthread_t tids[N];
for(i=0;i<N;i++)
{
if(pthread_create(&tids[i],NULL,func,(void *)&i)) //