📄 main.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#include <mem.h>
#include <malloc.h>
int random(int seed);
int ** getmatrix(int size);
int * getvector(int size);
void freematrix(int **matrix,int size);
void freevector(int *vector);
void printmatrix(int **matrix,int size);
void printvector(int *vector,int size);
int multi(int *row,int *vector,int size );
MPI_Request* MPIrequests(int size);
MPI_Status * MPIstatuses(int size);
//-------------------------------------------------------------------
int main(int argc, char *argv[])
{
MPI_Init(&argc,&argv);
int sum=0,NumProc,myrank,dest,src,namelen,size,tag;
int **matrix,*vector,*row,*resultvector;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Request Srequest;
MPI_Status Rstatus;
MPI_Comm_rank( MPI_COMM_WORLD, &myrank);
MPI_Comm_size(MPI_COMM_WORLD,&NumProc);
MPI_Get_processor_name(processor_name,&namelen);
size=NumProc;
if(myrank==0)
{
matrix=getmatrix(size);
vector=getvector(size);
printf("Matrix:\n");
printmatrix(matrix,size);
printf("Vector:\n");
printvector(vector,size);
}
else
{
row=(int*)malloc(size*sizeof(int));
vector=(int*)malloc(size*sizeof(int));
}
resultvector=(int*)malloc(size*sizeof(int));
if(myrank==0)//data passing in ring
{
tag=size-1;
MPI_Send(vector,size,MPI_INT,1,0,MPI_COMM_WORLD);
for(;tag>0;tag--)
{
MPI_Send(matrix[tag],size,MPI_INT,1,tag,MPI_COMM_WORLD);
}
printf("Proc %d on %s:\n",myrank,processor_name);
printvector(matrix[0],size);
sum=multi(matrix[0],vector,size);
MPI_Recv(resultvector,size,MPI_INT,1,0,MPI_COMM_WORLD,&Rstatus);
resultvector[0]=sum;
printf("Result vector:\n");
printvector(resultvector,size);
}
else
{
MPI_Recv(vector,size,MPI_INT,myrank-1,0,MPI_COMM_WORLD,&Rstatus);
if(myrank!=size-1)
MPI_Isend(vector,size,MPI_INT,myrank+1,0,MPI_COMM_WORLD,&Srequest);
tag=size-1;
for(;tag>myrank;tag--)
{
MPI_Recv(row,size,MPI_INT,myrank-1,tag,MPI_COMM_WORLD,&Rstatus);
MPI_Send(row,size,MPI_INT,myrank+1,tag,MPI_COMM_WORLD);
}
MPI_Recv(row,size,MPI_INT,myrank-1,myrank,MPI_COMM_WORLD,&Rstatus);
printf("Proc %d on %s:\n",myrank,processor_name);
printvector(row,size);
sum=multi(row,vector,size);
if(myrank!=size-1)
MPI_Recv(resultvector,size,MPI_INT,myrank+1,0,MPI_COMM_WORLD,&Rstatus);
resultvector[myrank]=sum;
MPI_Send(resultvector,size,MPI_INT,myrank-1,0,MPI_COMM_WORLD);
}
if(myrank==0)
{
freematrix(matrix,size);
freevector(vector);
}
else
{
freevector(row);
freevector(vector);
}
freevector(resultvector);
MPI_Finalize();
return 0;
}
//-----------------------------------------------------------
//-----------------------------------------------------------
int random(int seed)
{
//int time=(unsigned)time(NULL);
//seed = time*seed;
srand(seed);
seed=rand()%99-1;
return seed;
}
//-----------------------------------------------------------
int ** getmatrix(int size)
{
int row=0,line=0;
int **matrix;
matrix= (int**)malloc(size*sizeof(int*));
for(row=0;row<size;row++)
{
matrix[row]=(int*)malloc(size*sizeof(int));
for(line=0;line<size;line++)
{
matrix[row][line]=random((row+line)<<2);
}
}
return matrix;
}
//-----------------------------------------------------------
int *getvector(int size)
{
int line=0;
int *vector;
vector= (int*)malloc(size*sizeof(int));
for(line=0;line<size;line++)
{
vector[line]=random((~line)<<2);
}
return vector;
}
//-----------------------------------------------------------
void freematrix(int ** matrix,int size)
{
int row=0;
for(row=0;row<size;row++)
{
free(matrix[row]);
}
free(matrix);
}
//-----------------------------------------------------------
void freevector(int *vector)
{
free(vector);
}
//-----------------------------------------------------------
void printmatrix(int **matrix,int size)
{
int row=0,line=0;
for(row=0;row<size;row++)
{
for(line=0;line<size;line++)
{
printf("%3d ",matrix[row][line]);
}
printf("\n");
}
printf("\n");
}
//-----------------------------------------------------------
void printvector(int *vector,int size)
{
int line=0;
for(;line<size;line++)
{
printf("%3d ",vector[line]);
}
printf("\n\n");
}
//-----------------------------------------------------------
int multi(int *row,int *vector,int size )
{
int summa=0;
int i=0;
for(;i<size;i++)
{
summa=summa+row[i]*vector[i];
}
return summa;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -