并行矩阵与向量乘法,为简单起见,这里假设矩阵为n维方阵,向量为n维。进程数为矩阵的维数。按行卷帘存储。这里设n为3。每个进程存储矩阵的一行及向量的一个元素。
#include<stdio.h>
#include "mpi.h"
int main(int argc ,char ** argv)
{
MPI_Init(&argc,&argv);
int np,rank;
MPI_Status sta;
MPI_Comm_size(MPI_COMM_WORLD,&np);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
int A[3][3]={1,2,3,4,5,6,7,8,9};
int x[3]={3,2,1};
int B[3]={0,0,0};
int y=x[rank];
int mp1=(rank+1)%np;
int mm1=(rank-1+np)%np;
for(int i=0;i<3;i++)
{
B[rank]+=A[rank][(rank+i)%3]*y;
if(i!=2){
MPI_Send(&y,1,MPI_INT,mm1,0,MPI_COMM_WORLD);
MPI_Recv(&y,1,MPI_INT,mp1,0,MPI_COMM_WORLD,&sta);
}
}
printf("%d on rank %d process\n",B[rank],rank);
MPI_Finalize();
}
mpicc -o matrix matrix.c --std=c99
编译时加入--std=c99选项,否则出现
错误:在 C99 模式之外使用 ‘for’ 循环初始化声明
解决办法:
C99 允许在for语句的 “表达式1 ”中定义并初始变量, gcc4 编译c语言的默认标准是C89, 编译C99程序需加参数 “–-std=c99” 如:
#gcc hello.c -o hello.c --std=c99
mpicc -o matrix matrix.c --std=c99
mpiexec -n 3 ./matrix