Linux下利用多线程实现矩阵相乘的并行计算

本文探讨了在Linux环境下,使用多线程进行矩阵相乘的并行计算。虽然多核系统理论上能提高执行效率,但在实际中,由于线程数量过多导致每个线程工作量过小,大部分时间消耗在线程调度上,使得并行计算(0.56秒)反而慢于串行计算(0.07秒)。为了优化,建议调整线程数量以平衡工作负载。对并行计算感兴趣的同学可以参考相关资源进行深入学习。
摘要由CSDN通过智能技术生成

现代的线程库允许不同的线程运行在不同的处理器芯片上,从而实现真正意义上的并行。换句话说,如果你的机子是单核的,用多线程也没不会提高执行效率。

我的电脑是多核的,并行计算耗时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)) //
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值