MPI行列とベクトル乗算
並列行列とベクトル乗算は、単純化のため、ここでは行列がn次元方程式であり、ベクトルがn次元であると仮定する.プロセス数は、行列の次元数です.行のカーテンで保存します.ここでnを3とする.各プロセスは、マトリクスの1行とベクトルの要素を格納します.
mpicc -o matrix matrix.c--std=c 99コンパイル時に--std=c 99オプションを追加します.そうしないと、
エラー:C 99モード以外で「for」サイクル初期化宣言を使用して解決方法を宣言します.
C 99はfor文の「式1」で定義初期変数を許可し、gcc 4コンパイルc言語のデフォルト基準はC 89であり、コンパイルC 99プログラムはパラメータ「--std=c 99」を追加する必要がある.例えば、gcc hello.c -o hello.c --std=c99
mpicc -o matrix matrix.c --std=c99 mpiexec -n 3 ./matrix
#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
",B[rank],rank);
MPI_Finalize();
}
mpicc -o matrix matrix.c--std=c 99コンパイル時に--std=c 99オプションを追加します.そうしないと、
エラー:C 99モード以外で「for」サイクル初期化宣言を使用して解決方法を宣言します.
C 99はfor文の「式1」で定義初期変数を許可し、gcc 4コンパイルc言語のデフォルト基準はC 89であり、コンパイルC 99プログラムはパラメータ「--std=c 99」を追加する必要がある.例えば、gcc hello.c -o hello.c --std=c99
mpicc -o matrix matrix.c --std=c99 mpiexec -n 3 ./matrix