- 一个$n*n$方阵
- 一个向量(随机生成$[1,10]$的数)
- 进程数p
- 服务器分配方案
- 线程数
mpirun -n 4 -f f1 ./combal.3 /home/fx/Desktop/test_matrix/fx/FullChip.mtx 5
METIS_PartGraphKway
- 首先获取重排顺序
- 分别对矩阵和向量重排
- 分成本地矩阵和远程矩阵
- 子向量和本地矩阵划分,方法:前p-1个的行数都是floor(n/p),第p个是剩下的行数
eg1.
n=9 p=4
子矩阵行数是2 2 2 3
eg2.n=8 p=4
子矩阵行数是2 2 2 2
- 远程矩阵的划分,方法:前i个进程的非零元个数和不低于ceil(nnz/p*i) eg. 上图的远程矩阵
- 遍历子矩阵的非零元
- 如果此非零元满足以下条件,则需要发送消息
- 该列之前没有发送消息,x只会对同一个子矩阵发送一遍
- 经过以上两个步骤之后,我们可以得到以下信息:
- 发送消息的进程号
- 接收消息的进程号
- 发送消息的行号(接收消息的列号)
- 值val
- 子矩阵(本地矩阵、远程矩阵)
- 子向量
- part4 发送的消息(4.3.1发送消息的进程号=子进程号) (只是做好准备,没有真正发)
等待接收信息的同时,计算本地spmv
到此为止,就能进行远程矩阵spmv运算了