为了实现计算与通信的最大重叠 一个通用的原则就是 尽早开始通信 尽晚完成通信
在开始通信和完成通信之间进行计算 这样通信启动得越早 完成得越晚 就有可能有更多
的计算任务可以和通信重叠 也使通信可以在计算任务执行期间完成 而不需要专门的等待
时间
为此 修改Jacobi迭代过程如下
1 计算迭代任务中下次需要通信的数据
2 启动非阻塞通信 传递这些数据 转下一次迭代
3 计算剩余的迭代部分
在开始通信和完成通信之间进行计算 这样通信启动得越早 完成得越晚 就有可能有更多
的计算任务可以和通信重叠 也使通信可以在计算任务执行期间完成 而不需要专门的等待
时间
为此 修改Jacobi迭代过程如下
1 计算迭代任务中下次需要通信的数据
2 启动非阻塞通信 传递这些数据 转下一次迭代
3 计算剩余的迭代部分
4 完成非阻塞通信
#include<mpi.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 8;
const int SIZE = N / 4;
const int T = 2;
int main()
{
double matrix1[SIZE+2][N], matrix[SIZE+2][N];
int myid;
MPI_Status status[4];
MPI_Request request[4];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
memset(matrix1, 0, sizeof matrix1);
memset(matrix2, 0, sizeof matrix2);
//赋值边界数据
if(0 == myid)
for(int j = 0; j < N; j++)
matrix1[1][j] = matrix[2][j] = N;
if(3 == myid)
for(int j = 0; j < N; j++)
matrix1[SIZE][j] = matrix2[SIZE][j] = N;
for(int i = 1; i < SIZE+1; i++)
matrix1[i][0] = matrix1[i][N-1] = matrix2[0] = matrix2[N-1] = N;
//引入虚拟进程简化代码
int up_proc_id = myid==0 ? MPI_PROC_NULL : myid - 1;
int down_proc_id = myid==3 ? MPI_PROC_NULL : myid + 1;
//jacobi迭代
int t, row