多线程矩阵乘法运算 c++

473 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

问题

第一题,第二问一个4m×4m的方阵与一个4×1的列向量相乘,要求开4个线程运算。矩阵用随机数填充。 如图所示,长度为5的数组data,从0号进程发送给1号进程,1号进程接收到数据后,发送给2号进程,……,直到第n-1号进程,然后将数组data发送给0号进程。0号进程接收数据后,重复上述过程5次。

image.png 如图所示,阶数均为4m的满矩阵A与列向量x相乘,得到4m的列向量b,其中矩阵、向量的前m行在0号进程,后/m行在1号进程,再m行在2号进程,最后m行在3号进程。这里不妨设/m=150,矩阵元素介于[-10,10]随机生成,列向量x=[1..…4m]T image.png

代码

四个线程要访问的数据没有重合,不需要加锁,加锁反而就不是并行处理了。线程初始化后,要等待四个线程都运行结束,计算才全部结束。

#include <iostream>
#include <thread>
#include <mutex>
#include <random>
using namespace std;    
constexpr auto m = 150;
int A[m * 4][ m * 4];
int x[m * 4];
int b[m * 4];
void cal(int i) {
    cout << i << "线程正在运行" << endl;
    for (int p = i*m; p < (i+1) * m; p++) {
        b[p] = 0;
        for (int q = 0; q < 4 * m; q++) {
            b[p] += A[p][q] * x[q];
        }
    }
    cout << i << "线程运行结束" << endl;
}
int main()
{
    for (int i = 0; i < 4 * m; i++) {
        for (int j = 0; j < 4 * m; j++) {
            A[i][j] = rand() % 21 - 10;
        }
        x[i]= rand() % 21 - 10;
    }
    thread ts[4];
    for(int i=0;i<4;i++){
    	ts[i]=thread(cal,i);
    }
    for(int i=0;i<4;i++){
    	ts[i].join();
    }
    cout << "部分矩阵如下" << endl << "A=" << endl;
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            cout << A[i][j] << " ";
        }
        cout << endl;
    }
    cout << "x=" << endl;
    for (int i = 0; i < 10; i++) {
        cout << x[i] << endl;
    }
    cout << "b=" << endl;
    for (int i = 0; i < 10; i++) {
        cout << b[i] << endl;
    }
}