MPI矩阵向量乘法

这篇具有很好参考价值的文章主要介绍了MPI矩阵向量乘法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

完整的MPI矩阵向量乘法的算法,并在分布式环境下编译、排错、调试、运行、优化。


一、实验原理与提示

为方便矩阵的生成和计算结果的验证,可以通过自定义函数直接生成单位矩阵和元素全为1的向量用于计算。要特别注意注意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(A, local_m * n, MPI_DOUBLE, local_matrix, local_m * n, MPI_DOUBLE, 0, MPI_COMM_WORLD);
}

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);
}

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(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);
	}
}

void 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();	
}

三、实验效果

1.4*4矩阵向量乘法的实现。
mpi矩阵向量乘法,矩阵,算法,c语言,分布式

四、实验遇到的问题以及解决方法

问题1:无法动态生成矩阵的内存
解决方法:还是C语言的基础知识掌握不牢,学习malloc的函数使用进行解决。
问题2:该矩阵只能应用在能平均分配的基础上,即整除的情况需要进一步优化程序。
解决方法:进一步改变程序,通过让某一个进程担任不能整除多出来的进行解决。

总结

本次实验收获颇多,首先实现了生成矩阵并且动态分配空间,其次实现矩阵与向量的相乘,矩阵和向量相乘实现难度并不大,复杂的是如何分配给各个进程来实现,从中能学习到很多并行计算的知识,理解并行计算的思想,受益匪浅。文章来源地址https://www.toymoban.com/news/detail-540054.html

到了这里,关于MPI矩阵向量乘法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高性能计算实验——矩阵乘法基于MPI的并行实现及优化

    熟练掌握MPI编程方法,并将通用矩阵乘法转为MPI并行实现,进一步加深MPI的使用与理解。 进一步熟悉MPI矩阵乘法的实现,学习MPI点对点通信与集合通信的异同点和各自的优缺点,学会比较二者的性能以及各自使用的情形。 学习如何将自己编写的代码改造为标准库函数,供其

    2024年02月03日
    浏览(51)
  • MPI安装+CentOs6.5多机环境下MPI并行编程+MPI矩阵并行计算(超详细)

    创建多进程,输出进程号和进程数 运行多进程并行例子程序 编程实现大规模向量/矩阵并行计算 1、在开始安装之前,先检查一下是否已经安装好了相应的编译器。 2、安装MPICH之前,首先要在centos6.5上安装c编译器,(进入超级用户)使用指令安装如下: 3、(返回普通用户)

    2024年02月09日
    浏览(37)
  • CUDA 以及MPI并行矩阵乘连接服务器运算vscode配置

    本地安装 服务器端安装 c_cpp_properties.json launch.json tasks.json     本地安装和服务器端安装的扩展和CUDA一样 c_cpp_properties.json launch.json settings.json tasks.json

    2024年04月27日
    浏览(39)
  • R语言矩阵、向量操作(矩阵乘法,向量内积、外积(叉乘),矩阵转置,矩阵的逆)

    创建两个四维矩阵 A 与 B,A 按列填充,B 按行填充 : 创建两个 n 维向量 x 和 y : 使用 t(矩阵、向量名) 即可: 输出如下: 使用 %*% 符号即可: 输出如下: 在R语言中,两个矩阵、向量的内积并不只是简单的 * 号就完事了,而是有以下两种求法: 或者 其结果如下: (注意区分

    2024年02月12日
    浏览(32)
  • MPI和OpenMP实现蒙特卡罗算法

    基本思想 当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。 数学应用: 通常蒙特·卡罗方法通过构造符合

    2024年02月05日
    浏览(37)
  • MPI之MPI_Send&MPI_Recv阻塞接口及参数详解

    MPI简介以及阻塞非阻塞代码示例 MPI_Send buf:指向发送缓冲区的指针; count:发出的消息的数量(例如,整数个数、字节数等); datatype:发出消息的数据类型。MPI 数据类型通常是针对特定的数据结构(如 char、int、float 等)定义的,它仅能在使用相同 MPI_Datatype 的进程间传递

    2024年02月11日
    浏览(40)
  • mpi4py中加载MPI DLL时出错

    执行 from mpi4py import MPI 找不到 module named MPI;或者找不到 DLL 文件。 解决方案:  1、下载Download Microsoft MPI v10.0 from Official Microsoft Download Center   2、重新安装mpi4py

    2024年02月11日
    浏览(35)
  • C语言求任意两个矩阵相乘的算法(初学尝试矩阵乘法)

    C语言求任意两个矩阵相乘的算法(不同于大部分规格固定的矩阵乘法) 结果图如下   :                           代码如下: //----- 任意两个矩阵相乘 # include stdio.h int main (void) {     char ch;     int a, b, c, d;     printf (\\\"此算法用于任意两个矩阵相乘  n矩阵1(a行b列)

    2023年04月08日
    浏览(54)
  • MPI学习网站和资料

    1. MPI 文档 (1)https://rookiehpc.org/mpi/docs/index.html (2)Open MPI v4.1.6 documentation 2. MPI练习题 (1)MPI Exercises (2)Tutorials · MPI Tutorial 3. 推荐书籍 Parallel Programming with MPI Using MPI - 3rd Edition Using Advanced MPI - 1st Edition 高性能计算之并行编程技术—— MPI并行程序设计

    2024年01月22日
    浏览(76)
  • VS2022配置MPI环境

    一、安装VS2022 下载地址:https://visualstudio.microsoft.com/zh-hans/vs/ 下载Visual Studio,Community 2022 二、安装 MPI 地址:https://www.microsoft.com/en-us/download/details.aspx?id=57467 选择两个文件下载 三、创建项目 四、配置环境 1、添加源文件,打开项目属性,配置管理器、活动解决方案平台(x64)

    2024年02月15日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包