⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 并行编程
💻 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 + -