文章目录
前言
某个学期学习了高性能程序,老师布置的报告任务,为了防止曾经的记录丢失,我决定上传报告。
一、 安装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;
}
运行结果: