首页 > 系统相关 >wsl2(ubuntu)中运行MPI程序

wsl2(ubuntu)中运行MPI程序

时间:2024-10-14 18:19:56浏览次数:7  
标签:sum rank MPI ubuntu 进程 WORLD wsl2 size

问题:
搭建MPI并行计算环境,编写
MPI程序,求和
1+2+3+…+10000。
要求:
1.使用100个进程;
2.进程0计算1+2+…+100,
进程1计算101+102+…+200.
进程99计算9901+9902
+…+10000;
3.调用计时函数,分别输出每
个进程的计算时间;
4.需使用MPI集群通信函数和同步函数

解答:
1、安装OpenMPI:

sudo apt-get update
sudo apt-get install openmpi-bin openmpi-common libopenmpi-dev

2、验证安装:

mpiexec --version

结果如下:
在这里插入图片描述3、在codeblock中编写程序
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char** argv)
{
int rank, size;
int start, end, local_sum = 0, global_sum = 0;
double start_time, end_time;

// 初始化MPI环境
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

// 每个进程计算的范围
start = rank * 100 + 1;
end = start + 99;


// 记录开始时间
start_time = MPI_Wtime();

 // 计算局部和
for (int i = start; i <= end; i++) {
    local_sum += i;
}

// 使用MPI_Reduce计算全局和
MPI_Reduce(&local_sum, &global_sum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

 // 记录结束时间
end_time = MPI_Wtime();

// 输出每个进程的计算时间和局部和
printf("Process %d: Local Sum = %d, Time = %f seconds\n", rank, local_sum, end_time - start_time);

// 进程0输出全局和
if (rank == 0) {
    printf("Global Sum = %d\n", global_sum);
}

 // 结束MPI环境
MPI_Finalize();

return 0;

}
4、在Ubuntu命令窗口里尝试运行
在这里插入图片描述先用cd切换到程序所在目录 再编译 但其实目前有问题,报错:
在这里插入图片描述大概就是OpenMPI默认情况下不允许以root用户身份运行mpiexec,以提高安全性。我是又创建了个非root用户身份运行

sudo adduser newuser

然后填了两次密码,后面一直按的回车
在这里插入图片描述用命令su - newuser
切换到新用户,如下图所示:
在这里插入图片描述继续尝试运行,如下图:
在这里插入图片描述其中-n100 是因为本程序使用100个进程运行程序
又报错:
在这里插入图片描述这个错误信息表明系统中没有足够的资源(槽位)来满足你请求的100个进程。OpenMPI默认情况下会根据系统的CPU核心数来分配槽位。如果你希望在单个节点上运行100个进程,可以使用–oversubscribe选项来忽略槽位限制。
使用 --oversubscribe 选项
在运行mpiexec时,添加–oversubscribe选项:

mpiexec --oversubscribe -n 100 ./oshomework1

如下图所示重新编译运行:
在这里插入图片描述成功出现运行结果啦,如下图:
在这里插入图片描述下面对我一些代码进行讲解:
1、MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
在MPI(Message Passing Interface)程序中,MPI_Init、MPI_Comm_rank和MPI_Comm_size是三个常用的函数,用于初始化MPI环境、获取当前进程的标识符(rank)以及获取总进程数(size)。以下是对这些函数的详细解释:

  1. MPI_Init(&argc, &argv);
    功能:初始化MPI环境。
    参数:
    &argc:指向命令行参数数量的指针。
    &argv:指向命令行参数数组的指针。
    解释:
    在MPI程序中,MPI_Init是第一个被调用的MPI函数。它初始化MPI环境,使得后续的MPI函数可以被调用。
    通常情况下,argc和argv是从main函数的参数传递过来的。虽然这些参数在MPI程序中通常不会被使用,但MPI_Init需要它们作为参数。

  2. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    功能:获取当前进程的标识符(rank)。
    参数:
    MPI_COMM_WORLD:MPI通信域,表示所有进程的集合。
    &rank:指向存储当前进程标识符的变量的指针。
    解释:
    MPI_Comm_rank函数返回当前进程在指定通信域中的标识符(rank)。
    MPI_COMM_WORLD是MPI预定义的通信域,包含了所有参与MPI计算的进程。
    rank的值从0开始,依次递增,直到size - 1。每个进程都有一个唯一的rank值。

  3. MPI_Comm_size(MPI_COMM_WORLD, &size);
    功能:获取总进程数(size)。
    参数:
    MPI_COMM_WORLD:MPI通信域,表示所有进程的集合。
    &size:指向存储总进程数的变量的指针。
    解释:
    MPI_Comm_size函数返回指定通信域中的总进程数。
    MPI_COMM_WORLD是MPI预定义的通信域,包含了所有参与MPI计算的进程。
    size表示当前MPI程序中启动的总进程数。
    2、MPI_Reduce(&local_sum, &global_sum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD)
    MPI_Reduce是MPI(Message Passing Interface)中的一个集合通信函数,用于在所有进程中执行归约操作(reduction operation)。归约操作可以是求和、求最大值、求最小值等。MPI_Reduce将所有进程的局部数据汇总成一个全局结果,并将结果存储在指定的进程中
    参数讲解:
    &local_sum:发送缓冲区,指向当前进程的局部和。
    &global_sum:接收缓冲区,指向存储归约结果的变量。只有根进程(root process)会使用这个缓冲区。
    1:发送缓冲区中的元素数量。
    MPI_INT:发送缓冲区中元素的数据类型。
    MPI_SUM:归约操作类型,这里是求和操作。
    0:根进程的标识符(rank),归约结果将存储在这个进程中。
    MPI_COMM_WORLD:MPI通信域,表示所有进程的集合。
    详细解释:
    在MPI程序中,每个进程计算自己的局部和(local_sum),然后通过MPI_Reduce函数将所有进程的局部和汇总成一个全局和(global_sum)。具体步骤如下:
    每个进程计算局部和:
    每个进程根据自己的rank计算从start到end的和,并将结果存储在local_sum中。
    使用MPI_Reduce汇总局部和:
    MPI_Reduce函数会将所有进程的local_sum汇总成一个全局和,并将结果存储在根进程(rank为0的进程)的global_sum中。
    根进程输出全局和:
    只有根进程(rank为0的进程)会使用global_sum,并输出全局和。

标签:sum,rank,MPI,ubuntu,进程,WORLD,wsl2,size
From: https://blog.csdn.net/m0_49786943/article/details/142924109

相关文章

  • ubuntu20.04 ros noetic cv4 编译sg-slam问题汇总
    1.CV_RGB2GRAY2.CV_MINMAX3.CV_RGB2GRAY4.CV_FILLED引入头文件include<opencv2/imgproc/types_c.h>include<opencv2/opencv.hpp>include<opencv2/highgui/highgui_c.h>include<opencv2/imgproc/imgproc_c.h>或者1和3将CV_改为cv::COLOR_5.fatalerro......
  • 如何在 Ubuntu 16.04 上将 Nginx 网站根目录移动到新位置
    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。简介在Ubuntu上,默认情况下,Nginxweb服务器将其文档存储在/var/www/html目录中,通常位于根文件系统与操作系统的其余部分一起。然而,有时将文档根目录移动到另一个位置会......
  • 如何在 Ubuntu 16.04 上将 Apache Web 根目录移动到新位置
    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。简介在Ubuntu上,默认情况下,Apache2Web服务器将其文档存储在/var/www/html目录中,通常位于与操作系统其余部分相同的根文件系统上。然而,有时将文档根目录移动到另一个位......
  • 安装WSL2
    1.简介SWL2是windows平台上的linux系统,有一定的优点和限制,最差的一点就是网络了,只能使用NAT相似的技术,不能完全替代虚拟机.官网资料很详细了,也不是太多,这里只是提供快速入门.2.初始安装2.1.打开虚拟平台和WSL2.2.installlwsl2#1.设置wsl版本PSC:\Users\pc>wsl......
  • 【Ubuntu】“Linux版PhotoShop”绘图软件的安装和汉化
    【Ubuntu】“Linux版PhotoShop”绘图软件的安装和汉化零、前言最近换了Linux系统,但是写教程做PPT的时候还是得用到绘图软件,上网一查,总结对比之后发现Krita比较好用,故此讲解一下如何安装和汉化Krita。壹、安装安装很简单,按快捷键Ctrl+Alt+T,打开bash,输入如下命令(换国内镜像源会......
  • ubuntu交换空间设置
    租了一年的2核2G的阿里云服务器,随着安装的软件增多(其实也没装几个)发现开始偶尔出现卡顿。于是查看了一下,发现swap空间是0。才想起来,搞了之后只管用了,都没做什么配置。于是乎,先查看下系统情况:top-14:37:12up22min,2users,loadaverage:0.00,0.01,0.03Tasks:195t......
  • Windows10中安装了ubuntu虚拟机后xshell无法连接到ubuntu
    安装了ubuntu虚拟机后发现shell无法连接到ubuntu的排查步骤:步骤1:检查虚拟机网络配置确认虚拟机网络模式:确认虚拟机的网络模式是否设置为桥接模式或NAT模式。桥接模式可以让你的虚拟机在网络中拥有独立的IP地址,而NAT模式则通过宿主机的网络连接来访问外部网络。查看虚拟机IP地......
  • ubuntu 由于插拔移动硬盘导致无法挂载
    如果之前可以使用,但拔出后再连接就无法挂载了,可以尝试以下步骤:检查硬盘状态:运行sudofdisk-l或lsblk命令,确认系统是否识别到了硬盘。文件系统检查:如果是NTFS格式,可以使用ntfsfix来修复。首先,确保安装了ntfs-3g:sudoapt-getinstallntfs-3g然后运行:sudontfs......
  • Ubuntu20.04安装unifi网络服务器
    1、更新软件和系统sudoaptupdate&&sudoapt-yfull-upgrade2、添加存储库所需的依赖项sudoaptinstallcurlgpggnupg2software-properties-commonapt-transport-httpslsb-releaseca-certificates 3、将GPG密钥添加到您的系统密钥环中 curl-fsSLhttps://pgp......
  • Ubuntu中Conda建立环境和删除环境
    网上说的很全面了,这里我把我遇到的一些问题和解决方案罗列出来,以便未来的学习和了解。博客的好处就体现出来了,下次你再用这个东西,就直接打开你的博客照抄就行了,不用东搜西搜了,及其方便,这种碎片化的东西,比记在笔记本或者而备忘要省事儿的多。。。创建环境condacreate-nxxxxxx......