本文已参与「新人创作礼」活动,一起开启掘金创作之路。
问题
第一题,第二问一个4m×4m的方阵与一个4×1的列向量相乘,要求开4个线程运算。矩阵用随机数填充。 如图所示,长度为5的数组data,从0号进程发送给1号进程,1号进程接收到数据后,发送给2号进程,……,直到第n-1号进程,然后将数组data发送给0号进程。0号进程接收数据后,重复上述过程5次。
如图所示,阶数均为4m的满矩阵A与列向量x相乘,得到4m的列向量b,其中矩阵、向量的前m行在0号进程,后/m行在1号进程,再m行在2号进程,最后m行在3号进程。这里不妨设/m=150,矩阵元素介于[-10,10]随机生成,列向量x=[1..…4m]T
代码
四个线程要访问的数据没有重合,不需要加锁,加锁反而就不是并行处理了。线程初始化后,要等待四个线程都运行结束,计算才全部结束。
#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;
}
}