📄 icpi.c
字号:
//A(4,4)*B(4,1)=C(4,1)
//如果单机执行,进程数为4
//如果机群执行,并行机个数为4
#include <stdio.h>
#include <mpi.h>
#define SIZE 4
int main(int argc, char **argv) {
int j;
int rank, size, root;
float X[SIZE];
float X1[SIZE];
float Y1[SIZE];
float Y[SIZE][SIZE];
float Z[SIZE];
float z;
root = 0;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
printf("%d %d %d\n",SIZE,size,rank);
if (rank==root)
{
Y[0][0] = 1; Y[1][0] = 2; Y[2][0] = 3; Y[3][0] = 4;
Y[0][1] = 5; Y[1][1] = 6; Y[2][1] = 7; Y[3][1] = 8;
Y[0][2] = 9; Y[1][2] = 10; Y[2][2] = 11; Y[3][2] = 12;
Y[0][3] = 13; Y[1][3] = 14; Y[2][3] = 15; Y[3][3] = 16;
Z[0] = 1;
Z[1] = 2;
Z[2] = 3;
Z[3] = 4;
}
MPI_Barrier(MPI_COMM_WORLD); //聚合通信_障碍同步,调用该函数时进程处于等待状态
//直到通信器中所有的进程都调用该函数是才继续执行.
MPI_Scatter(Y,SIZE,MPI_FLOAT,Y1,SIZE,MPI_FLOAT,root,MPI_COMM_WORLD);
//聚合通信_数据散发,它将一个进程中的数据按块散发给通信器中的所有进程
//依次散发,本题中散发情况为:
//Y[0][0]->0,Y[0][1]->1,Y[0][2]->2,Y[0][3]->3
//Y[1][0]->0,Y[1][1]->1,Y[1][2]->2,Y[1][3]->3
//Y[2][0]->0,Y[2][1]->1,Y[2][2]->2,Y[2][3]->3
//Y[3][0]->0,Y[3][1]->1,Y[3][2]->2,Y[3][3]->3
MPI_Scatter(Z,1,MPI_FLOAT,&z,1,MPI_FLOAT, root,MPI_COMM_WORLD);
//分别将Z[0],Z[1],Z[2],Z[3],散发给进程0,1,2,3
for(j=0;j <SIZE;j++)
{
X1[j] = z*Y1[j];
}
MPI_Reduce(X1,X,SIZE,MPI_FLOAT,MPI_SUM,root,MPI_COMM_WORLD);
//聚合通信_归约,求和
if (rank==0)
{
printf("%g %g %g %g %g\n",Y1[0],Y1[1],Y1[2],Y1[3],z); //进程0分配的各数据,Y1[SIZE],z
printf( "%g\n",X[0]);printf( "%g\n",X[1]);printf( "%g\n",X[2]);printf( "%g\n",X[3]);
}
MPI_Finalize();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -