VM,CentOS7,gcc,mpich安装,vim配置,mpi代码运行示例

前言

某个学期学习了高性能程序,老师布置的报告任务,为了防止曾经的记录丢失,我决定上传报告。

一、 安装VMware Workstation Pro 16

进入官网https://www.vmware.com/cn.html
在这里插入图片描述

选Workstation Pro进行下载安装并输入获得的密钥激活软件。

二、 下载CentOS-7

考虑到网络因素,进入https://mirrors.ustc.edu.cn/中国科学技术大学镜像网站下载CentOS-7
在这里插入图片描述

选择需要的镜像文件下载。

三、 在VM上安装CentOS-7

选择创建新的虚拟机
在这里插入图片描述
在这里插入图片描述

使用默认配置,下一步。
找到CentOS的下载路径并选择,继续下一步。
在这里插入图片描述

为虚拟机磁盘空间划分90GB
勾选第一项将虚拟磁盘存储为单个文件
在这里插入图片描述

后续下一步,直至虚拟机创建完成自动重启。
在这里插入图片描述

重启后自动进入安装程序,按回车确认开始。
在这里插入图片描述

安装过程中可以选择用中文或者英文,此处由于我熟悉英文,选择了过程中使用英文,再点击下一步。
在这里插入图片描述

首先到最下边的网络设置,点击这个选项
在这里插入图片描述

点击OFF变成ON开启网络连接,看到speed为1000说明网络连接成功,点击Done返回主页
在这里插入图片描述

设置时间选择上海时区,并开启网络对齐。完成后点击Done返回主页。
在这里插入图片描述
在这里插入图片描述

打开语言支持选择中文和英文,完成后返回主页。
在这里插入图片描述
在这里插入图片描述

输入设置选择英文和中文输入法。完成后返回主页。
在这里插入图片描述
在这里插入图片描述

进行磁盘划分
在这里插入图片描述
在这里插入图片描述

选择安装内容
选择带图形界面的系统以及基本开发工具,包括了GCC以及vm-tools,为后续工作节省大量时间,以及后续出错的可能。
在这里插入图片描述在这里插入图片描述

开始安装,并且设置root密码以及用户密码
在这里插入图片描述
在这里插入图片描述

如果密码过于简单需要点击两次Done确认密码。等待安装完成即可开机使用。

四、 安装mpich

输入命令:su
进入root账户
输入命令:yum install -y mpich-3.2-devel.x86_64
安装mpich
输入命令:vim ~/.bashrc
编辑环境变量配置
在最末行添加:export PATH=$PATH:/usr/lib64/mpich-3.2/bin/
退出编辑后
再输入命令:source ~/.bashrc
使环境变量立即生效
退出root账户后,重复编辑环境变量操作即可在普通用户权限下使用mpich。

五、 简单配置vim

输入命令:vim ~/.vimrc
编辑vim设置

在这里插入图片描述

set autoindent  ""自动缩进
set cindent ""以C语言的方式缩进
set shiftwidth=4 ""设置自动缩进的空格数量
set softtabstop=4 ""tab键的实际占有空格数,统一缩进
set tabstop=4 ""设置tab键的空格数
set nu ""设置显示行号

六、 编写程序并使用gcc以及mpich进行编译程序

案例一:请你给杨幂,赵丽颖,杨颖每人转发一枝玫瑰。
代码:

#include<stdio.h>
#include<mpi.h>
int main(int argc,char *argv[]){
   int a=1,i=0;
	int myid,size;
	char *my[] = {"杨幂","赵丽颖","杨颖"};
    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    MPI_Comm_rank(MPI_COMM_WORLD,&myid);
	if(myid==0)
	{
		for(i=1;i<size;i++){
			printf("myid=%d,给%s,%d朵花\n",myid,my[i-1],a);
			MPI_Send(&a,1,MPI_INT,i,999,MPI_COMM_WORLD);
	}
	}
	else {
		MPI_Recv(&a,1,MPI_INT,0,999,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
		printf("myid=%d%s收到%d朵花\n",myid,my[myid-1],a);
	}

        MPI_Finalize();
        return 0;
}

运行结果:
在这里插入图片描述

案例二:Double B[5],请将B数组每个数据的值加1并从0号进程传递给1号进程,再将数组每个数据值加1,并由1号进程传递给2号进程……以此类推,最后由n号进程传递给0号进程,并输出B数组。
代码:

#include<stdio.h>
#include<mpi.h>
int main(int argc,char *argv[])
{	
	int i = 0;
	int myid,size;
	double b[5]={0,1,2,3,4};
        MPI_Init(&argc,&argv);
        MPI_Comm_size(MPI_COMM_WORLD,&size);
        MPI_Comm_rank(MPI_COMM_WORLD,&myid);
	if(myid==0)
	{
	
for(i=0;i<5;i++){
		b[i]=b[i]+1;
	}
	MPI_Send(b,5,MPI_DOUBLE,1,999,MPI_COMM_WORLD);
	
	MPI_Recv(b,5,MPI_DOUBLE,size-1,999,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
	for(i=0;i<5;i++){
		printf("%f,",b[i]);
	}
		printf("\n");
	}
	else {
		MPI_Recv(b,5,MPI_DOUBLE,(myid-1)%size,999,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
		for(i=0;i<5;i++){
		b[i]=b[i]+1;
		}
		
		MPI_Send(b,5,MPI_DOUBLE,(myid+1)%size,999,MPI_COMM_WORLD);
	}
	

        MPI_Finalize();
        return 0;
}

运行结果:
在这里插入图片描述

案例三:梯形积分法计算函数y=x*x+1在区间积分
非并行代码:

#include<stdio.h>
int main(){
	double jifen(double a,double b);
//	double f(double x);
	double a=jifen(0.0,3.0);
	printf("积分结果为%lf\n",a);
}
double jifen(double a,double b){
	double f(double x);
	double d = (b-a)/10000;
	double result = 0;
	for(;a<=b;a=a+d){
		result = result+(f(a)+f(a+d))*d/2;
	}
	return result;
}
double f(double x){
	return x*x+1;
}

运行结果:
在这里插入图片描述

Mpi代码:

#include<stdio.h>
#include<mpi.h>
double Trap(double left_endpt,double right_endpt,double base_len);
double f(double x);

int main(int argc,char *argv[]){
	int my_rank,comm_sz,n=2048,local_n; 
	double a=0.0,b=3.0,h,local_a,local_b;//所求积分起始和结束位置,每个段内积分起始终止位置 
	double s,total_s;
	int i;
	
	MPI_Init(&argc,&argv);
	MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
	MPI_Comm_size(MPI_COMM_WORLD,&comm_sz);
	
	h=(b-a)/n;//步长 
	
	local_n =n/comm_sz;//每一段的计算次数
	local_a =a+my_rank *local_n*h;
	local_b =local_a+local_n*h;
	
	s =Trap(local_a,local_b,h);//计算局部值 
	
	if(my_rank !=0){//不是0号进程,发送局部值到0号进程 
		
	MPI_Send(&s,1,MPI_DOUBLE,0,0,MPI_COMM_WORLD);
	}
	else{                
		total_s =s;
		for(i =1;i<comm_sz;i++) {
	 		MPI_Recv(&s,1,MPI_DOUBLE,i,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
	 		total_s+=s; 
		
	 }
		printf("当 n = %d trapezoids,our estimate\n",n);
		printf("of the intergral from %f to %f =%.15e\n",a,b,total_s);
	}

	MPI_Finalize();
	return 0;
	
}
double Trap(double a,double b,double d){
	double result = 0;
	for(;a<=b;a=a+d){
		result +=(f(a)+f(a+d))*d/2;
	}
	return result;
}
double f(double x){ //计算的要积分的函数 
	return x*x+1;
}

运行结果:

在这里插入图片描述

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TwilightPureDrm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值