MPI矩陣向量乘法程式碼《並行程式設計導論》
本文所寫內容是根據《並行程式設計導論》第三章中的矩陣向量乘法程式碼總結而來的完整程式碼。
完整程式碼如下Mat_vect_mult.c
#include<stdio.h>
#include<mpi.h>
#include<stdlib.h>
void Get_input(int my_rank,int *m,int *n)
{
if(my_rank==0){
printf("Please enter m,n:\n");
scanf("%d %d",m,n);
}
MPI_Bcast(m,1,MPI_INT,0,MPI_COMM_WORLD);
MPI_Bcast(n,1,MPI_INT,0,MPI_COMM_WORLD);
}
//得到矩陣
void Get_matrix(int n, int m, double *local_matrix, int local_m, int my_rank)
{
double *A;
if (!my_rank)
{
A = (double *)malloc(m * n * sizeof(double));
printf("Please enter the matrix:\n");
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j)
scanf("%lf", &A[i * n + j]);
}
//MPI_Scatter函式將矩陣分發出去
MPI_Scatter(A, local_m * n, MPI_DOUBLE, local_matrix, local_m * n, MPI_DOUBLE, 0, MPI_COMM_WORLD);
}
//列印矩陣
//MPI_Gather函式將local_matrix從各個程式聚集到0號程式輸出
void Print_matrix(int my_rank,int n,int m,int local_m,double *local_matrix,MPI_Comm comm)
{
double *matrix = NULL;
int i,j;
if(my_rank==0)
{
matrix = malloc(m*n*sizeof(double));
MPI_Gather(local_matrix,local_m*n,MPI_DOUBLE,matrix,local_m*n,MPI_DOUBLE,0,comm);
printf("The matrix is:\n");
for(i=0;i<m;++i)
{
for(j=0;j<n;++j)
{
printf("%f ",matrix[i*n+j]);
}
printf("\n");
}
free(matrix);
}
else{
MPI_Gather(local_matrix,local_m*n,MPI_DOUBLE,matrix,local_m*n,MPI_DOUBLE,0,comm);
}
}
//得到向量並分發
void Get_vector(int my_rank,int n,int local_n,double *local_vector,MPI_Comm comm)
{
double *vector = NULL;
int i;
if(my_rank==0)
{
vector=(double *)malloc(n*sizeof(double));
printf("Please enter the vector:\n");
for(i=0;i<n;i++)
{
scanf("%lf",&vector[i]);
}
}
printf("\n");
MPI_Scatter(vector,local_n,MPI_DOUBLE,local_vector,local_n,MPI_DOUBLE,0,comm);
}
//聚合向量到0號程式並且輸出
void Print_vector(int my_rank,int n,int local_n,double *local_vector,MPI_Comm comm)
{
double *vector = NULL;
int i,j;
if(my_rank==0)
{
vector = malloc(n*sizeof(double));
MPI_Gather(local_vector,local_n,MPI_DOUBLE,vector,local_n,MPI_DOUBLE,0,comm);
printf("The vector is:\n");
for(i=0;i<n;i++){
printf("%f ",vector[i]);
}
printf("\n");
free(vector);
}
else{
MPI_Gather(local_vector,local_n,MPI_DOUBLE,vector,local_n,MPI_DOUBLE,0,comm);
}
}
//實現矩陣乘法
void Mat_vect_mult(double *local_matrix,double *local_vector,double *local_y,int local_m,int n,int local_n,MPI_Comm comm)
{
int local_i,j;
double *x;
x=malloc(n*sizeof(double));
//將向量聚合到所有程式,MPI_Allgather和MPI_Gather的區別就在於Allgather的所
//有程式都會知道你聚合到的的向量,相當於聚合到0號程式之後又bcast廣播了一次
MPI_Allgather(local_vector,local_n,MPI_DOUBLE,x,local_n,MPI_DOUBLE,comm);
for(local_i=0;local_i<local_m;local_i++)
{
local_y[local_i]=0.0;
for(j=0;j<n;j++)
{
local_y[local_i]+=local_matrix[local_i*n+j]*x[j];
}
}
free(x);
}
//列印結果
void Print_y(int my_rank,double *local_y,int m,int local_m,MPI_Comm comm)
{
double *y=NULL;
int i;
if(my_rank==0){
y=malloc(m*sizeof(double));
MPI_Gather(local_y,local_m,MPI_DOUBLE,y,local_m,MPI_DOUBLE,0,comm);
printf("The vector y is:\n");
for(i=0;i<m;i++)
{
printf("%lf ",y[i]);
}
printf("\n");
free(y);
}
else{
MPI_Gather(local_y,local_m,MPI_DOUBLE,y,local_m,MPI_DOUBLE,0,comm);
}
}
int main()
{
int comm_sz,my_rank,i;
int m,n,local_m,local_n;
double *local_matrix,*local_vector;
double *local_y;
MPI_Init(NULL,NULL);
MPI_Comm_size(MPI_COMM_WORLD,&comm_sz);
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
Get_input(my_rank,&m,&n);
local_m=m/comm_sz;
local_n=n/comm_sz;
local_matrix=(double *)malloc(local_m*n*sizeof(double));
local_vector=(double *)malloc(local_n*sizeof(double));
local_y=(double *)malloc(local_m*sizeof(double));
Get_matrix(n,m,local_matrix,local_m,my_rank);
Print_matrix(my_rank,n,m,local_m,local_matrix,MPI_COMM_WORLD);
Get_vector(my_rank,n,local_n,local_vector,MPI_COMM_WORLD);
Print_vector(my_rank,n,local_n,local_vector,MPI_COMM_WORLD);
Mat_vect_mult(local_matrix,local_vector,local_y,local_m,n,local_n,MPI_COMM_WORLD);
Print_y(my_rank,local_y,m,local_m,MPI_COMM_WORLD);
MPI_Finalize();
return 0;
}
編譯執行指令為
mpicc -o a.out Mat_vect_mult.c //編譯
mpiexec -n <程式數> ./a,out //執行
執行例項如圖
相關文章
- torch中向量、矩陣乘法大總結矩陣
- 矩陣乘法矩陣
- 機器學習中的矩陣向量求導(五) 矩陣對矩陣的求導機器學習矩陣求導
- 機器學習中的矩陣向量求導(四) 矩陣向量求導鏈式法則機器學習矩陣求導
- 向量和矩陣求導公式總結矩陣求導公式
- 【Triton 教程】矩陣乘法矩陣
- cuda 加速矩陣乘法矩陣
- MKL庫矩陣乘法矩陣
- 併發程式設計導論程式設計
- 怎樣用python計算矩陣乘法?Python矩陣
- 2024 計算導論與程式設計程式設計
- 【矩陣乘法】Matrix Power Series矩陣
- TGDC | 一個遊戲程式設計師的堅持 —— 論向量化程式設計遊戲程式設計師
- 【矩陣乘法】【快速冪】遞推矩陣
- POJ 3613 Cow Relays 矩陣乘法Floyd+矩陣快速冪矩陣
- (Python程式設計 | 系統程式設計 | 並行系統工具 | 程式退出)Python程式設計並行
- Python的向量和矩陣乘法意義大全包括dot和*的區別(2020)Python矩陣
- 基向量 變換矩陣矩陣
- cuda程式設計與gpu平行計算(六):圖稀疏矩陣轉為CSR結構並傳入gpu程式設計GPU矩陣
- 非科班程式設計師才不知道的矩陣Matrix程式設計師矩陣
- 第四個OpenGL程式,vector 向量 (矩陣變換之 旋轉,縮放)矩陣
- 矩陣:如何使用矩陣操作進行 PageRank 計算?矩陣
- 【程式碼隨想錄】一、陣列:5.螺旋矩陣陣列矩陣
- 矩陣求導矩陣求導
- CUDA 矩陣乘法終極優化指南矩陣優化
- 斐波那契數列Ⅳ【矩陣乘法】矩陣
- 並行程式設計並行行程程式設計
- 動手畫混淆矩陣(Confusion Matrix)(含程式碼)矩陣
- .NET併發程式設計-資料並行程式設計並行
- 【測繪程式設計試題集】 試題02 矩陣卷積計算程式設計矩陣卷積
- 矩陣的特徵值和特徵向量矩陣特徵
- 碼農很多,但程式設計師並不多......程式設計師
- JavaScript陣列合並程式碼例項JavaScript陣列
- 【矩陣基礎與維度分析】【公式細節推導】矩陣非線性最小二乘法泰勒展開矩陣公式
- 矩陣求導(二)矩陣求導
- 矩陣求導(一)矩陣求導
- 程式導向程式設計哲學程式設計
- Python並行程式設計Python並行行程程式設計