?? icpi.c
字號(hào):
//A(4,4)*B(4,1)=C(4,1)
//如果單機(jī)執(zhí)行,進(jìn)程數(shù)為4
//如果機(jī)群執(zhí)行,并行機(jī)個(gè)數(shù)為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); //聚合通信_(tái)障礙同步,調(diào)用該函數(shù)時(shí)進(jìn)程處于等待狀態(tài)
//直到通信器中所有的進(jìn)程都調(diào)用該函數(shù)是才繼續(xù)執(zhí)行.
MPI_Scatter(Y,SIZE,MPI_FLOAT,Y1,SIZE,MPI_FLOAT,root,MPI_COMM_WORLD);
//聚合通信_(tái)數(shù)據(jù)散發(fā),它將一個(gè)進(jìn)程中的數(shù)據(jù)按塊散發(fā)給通信器中的所有進(jìn)程
//依次散發(fā),本題中散發(fā)情況為:
//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],散發(fā)給進(jìn)程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);
//聚合通信_(tái)歸約,求和
if (rank==0)
{
printf("%g %g %g %g %g\n",Y1[0],Y1[1],Y1[2],Y1[3],z); //進(jìn)程0分配的各數(shù)據(jù),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;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -