MPI实现向量相加 | 丁香推荐网

MPI实现向量相加

编程杂谈 funy 1年前 (2019-08-15) 582次浏览 已收录 0个评论 扫描二维码

前言

这是一个用MPI写的向量相加程序,仅供参考,如有任何疑问,请留言。初学MPI,如有错误,请指正。

/*================================================================ 
*   Copyright (C) 2019 * Ltd. All rights reserved. 
* 
*   File name   : mpi_vector.c 
*   Author      : ljh 
*   Created date: 2019-04-07 15:02:13 
*   Description : mpi向量加法程序 
* 
*===============================================================*/ 

#include  
#include  
#include  

//声明函数:向量加法 
void Add_vector(double *vec1, double *vec2, int n); 
int Create_vector(double **vec,int num); 
int Read_vector(double *local_a,int local_n, int n, char vec_name[], int my_rank, MPI_Comm comm); 
int Print_vector(double *local_b,int local_n, int n, char title[], int my_rank, MPI_Comm comm); 

int main() 
{ 
   int n,rank,size,local_n; 
   double *local_a = NULL; 
   double *local_b = NULL; 
   char vec_name1[10] = "vector1"; 
   char vec_name2[10] = "vector2"; 
   int i; 

   //MPI初始化,获取总进程数量,进程号 
   MPI_Init(NULL,NULL); 
   MPI_Comm comm = MPI_COMM_WORLD; 
   MPI_Comm_size(comm, &size); 
   MPI_Comm_rank(comm, &rank); 
   if(rank == 0) 
   { 
       printf("请输入向量大小:\n"); 
       scanf("%d",&n); 
       for(i = 1;i < size; ++i) 
           MPI_Send(&n, 1, MPI_INT, i, 0, comm);  
   } 
   else 
   { 
       MPI_Recv(&n, 1, MPI_INT, 0, 0, comm, MPI_STATUS_IGNORE);  
   } 

   local_n = n / (size-1);//这里只能算整除的情况 
   if(Create_vector(&local_a, local_n) || Create_vector(&local_b, local_n)) 
       return -1; 
   //读取数据 
   if(Read_vector(local_a, local_n, n, vec_name1, rank, comm)||Read_vector(local_b, local_n, n, vec_name2, rank, comm)) 
       return -1; 
   //计算 
   Add_vector(local_a, local_b, local_n); 
   //输出 
   Print_vector(local_a, local_n, n, vec_name1, rank, comm); 

   MPI_Finalize(); 
   free(local_a); 
   free(local_b); 

   return 0; 
} 

//0号进程读入需要加的向量 
int Read_vector(double *local_a,int local_n, int n, char *vec_name, int my_rank, MPI_Comm comm) 
{ 
   double *a = NULL; 
   int i; 

   if(my_rank == 0) 
   { 
       if(Create_vector(&a, n)) 
           return 1; 
       printf("请输入向量%s:\n",vec_name); 
       for(i = 0;i < n; ++i) 
           scanf("%lf",&a[i]); 
       MPI_Scatter(a,local_n,MPI_DOUBLE,local_a,local_n,MPI_DOUBLE,0,comm); 
       free(a); 
   } 
   else 
   { 
       MPI_Scatter(a,local_n,MPI_DOUBLE,local_a,local_n,MPI_DOUBLE,0,comm); 
   } 
   return 0; 
} 
//打印向量相加结果 
int Print_vector(double local_b[],int local_n, int n, char title[], int my_rank, MPI_Comm comm) 
{ 
   double *b = NULL; 
   int i; 

   if(my_rank == 0) 
   { 
       if(Create_vector(&b, n)) 
           return 1; 
       printf("%s\n",title); 
       MPI_Gather(local_b,local_n,MPI_DOUBLE,b,local_n,MPI_DOUBLE,0,comm); 
       for(i = 0;i < n; ++i) 
           printf("%f ", b[i]); 
       printf("\n"); 
       free(b); 
   } 
   else 
   { 
       MPI_Gather(local_b,local_n,MPI_DOUBLE,b,local_n,MPI_DOUBLE,0,comm); 
   } 
   return 0; 
} 
//分配内存 
int Create_vector(double **vec,int num) 
{ 
   if((*vec = (double*)malloc(num*sizeof(double))) == NULL) 
   { 
       return 1; 
   } 
   return 0; 
} 
//向量相加 
void Add_vector(double *vec1, double *vec2, int n) 
{ 
   int i; 
   for(i = 0;i < n; ++i) 
       vec1[i] += vec2[i]; 
}


本站交流 Telegram群组Telegram频道 QQ群
丁香推荐网, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:MPI实现向量相加
喜欢 (0)
关于作者:
分享互联网资源,VPS测评,VPS推荐,VPS优惠通知!

您必须 登录 才能发表评论!