注意:
- 此教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间示例值。完成实验室时,请将这些值替换为特定于您的云环境的值。
在 Oracle Roving Edge Infrastructure 上使用开放 MPI
简介
Oracle Roving Edge Infrastructure 是一个加固的云计算和存储平台,适用于在网络边缘或外部连接有限或没有外部连接的位置部署。随着更大、更复杂和更苛刻的工作负载向网络边缘移动,这可能会给边缘基础设施带来挑战。
Open MPI 是消息传递接口 (Message Passing Interface,MPI) 标准的实现,用于在高性能计算 (High Performance Computing,HPC) 中开发并行应用程序。开放式 MPI 可用于在相对较小的基础设施中部署高性能计算和高度并行工作负载,然后作为较大的聚合资源集运行。此方法可用于将负载分配给 CPU 和其他计算资源(例如 GPU),这允许在网络边缘部署更大的计算密集型任务,例如预测建模或其他人工智能/机器学习 (Artificial Intelligence/Machine Learning,AI/ML) 任务。
Open MPI 可用于利用 Oracle Roving Edge Infrastructure 节点中的资源部署并行工作负载。Netfilter 使用托管在 Oracle Roving Edge Infrastructure 节点上的集群软件为 VM 实例提供必要的目标网络地址转换 (Destination Network Address Translation,DNAT) 和源网络地址转换 (Source Network Address Translation,SNAT)。本教程在运行素数计算器的 Oracle Roving Edge Infrastructure 上使用 Netfilter 实施 Open MPI,以演示在使用并行资源时性能的提高。
背景信息
Open MPI 可以在单个 Oracle Roving Edge Infrastructure 节点内或跨多个 Oracle Roving Edge Infrastructure 节点跨多个虚拟机 (VM) 实例运行。在单个 Oracle Roving Edge Infrastructure 节点上运行是无缝的,不会造成任何问题。当跨多个 Oracle Roving Edge Infrastructure 节点运行时,了解 Oracle Roving Edge Infrastructure VM 实例上的网络以及 Open MPI 如何路由流量以避免可能的问题非常重要。
在 Oracle Roving Edge Infrastructure 虚拟机实例上建立网络
在 Oracle Roving Edge Infrastructure 上运行的虚拟机实例使用专用 IP 地址与同一节点上托管的同一子网上的其他 VM 实例通信。可以将公共 IP 地址分配给 Oracle Roving Edge Infrastructure 上托管的 VM 实例,以允许实例与在托管的 Oracle Roving Edge Infrastructure 节点外部运行的其他子网和资源进行通信。
注:公共 IP 地址会从公共 IP 地址池分配给 VM 实例 VNIC。虽然这些地址称为公共 IP ,但它们实际上是 Oracle Roving Edge Infrastructure 节点通过其 RJ-45 端口连接的同一本地网络上的 IP 地址。这些地址可以是可从 Internet 访问的 IPv4 地址,也可以是本地网络上专用子网上的地址。这些地址也称为外部 IP 地址,因为它们可以连接到托管 VM 实例的节点外部的资源。
了解在 Oracle Roving Edge Infrastructure 节点中运行的 VM 实例何时尝试访问节点外部的资源,流量通过在节点内路由的外部 IP 地址并输出到外部网络连接,这一点非常重要。
-
VM 使用的专用 IP 地址由托管 Oracle Roving Edge Infrastructure 节点转换为从公共 IP 地址池分配的公共(外部)IP 地址。
-
网络流量从托管 Oracle Roving Edge Infrastructure 节点上的 VM 实例传输到外部网络,这实际上是 1:1 网络地址转换 (Network Address Translation,NAT)。
-
VM 实例具有公共(外部)IP 地址,但 VM 实例本身从未看到该 IP 地址。
-
另一方面,使用为其分配的公共(外部)IP 地址的 VM 实例外部流量将转至托管 Oracle Roving Edge Infrastructure 节点,该节点将公共(外部)IP 地址转换为目标 VM 实例的关联专用 IP 地址。
下图显示了 Oracle Roving Edge Infrastructure 节点上的 VM 实例示例,请注意分配的公共和专用 IP 地址。
在多个 Oracle Roving Edge Infrastructure 节点上运行开放 MPI 的挑战
在多个 Oracle Roving Edge Infrastructure 节点上实施 VM 实例专用 IP 地址时,集群软件(例如 Open MPI)存在问题。每个节点不知道专用到公共 IP 地址映射,也不知道在其他节点上托管的 VM 实例的映射的转换。由于映射不共享,因此使用专用 IP 地址的数据包路由不正确或丢失。
-
集群软件通常会检查 VM 实例接口和 IP 地址,并将信息注册到软件集群中的其他节点。
-
VM 实例仅知道其专用 IP 地址,无法共享其分配的公共 IP 地址。
-
托管其他集群成员的远程 Oracle Roving Edge Infrastructure 节点也无法将非托管 VM 实例专用 IP 地址转换为各自的公共 IP 地址。
-
当托管在不同 Oracle Roving Edge Infrastructure 节点上的 VM 实例集群通过其公共 IP 地址进行握手时,其配置交换可能仅包含其专用 IP 地址。
- 如果这些 VM 实例尝试通过 Oracle Roving Edge Infrastructure 节点上的专用 IP 地址进行通信,则流量将推送到外部网络,并且外部网络可能会错误地丢弃或路由。
使用 Open MPI 时此问题的外观示例:
在 VM 实例上运行的开放 MPI 将尝试确定用于访问其他 VM 实例成员的最佳网络路径,软件可能会检查本地接口和 IP 地址,并将这些地址注册到集群中的其他节点。
-
遗憾的是,源节点或目标节点都不知道要进行连接所需的网络地址转换。
-
如果
vm-node-1
的专用 IP 为10.0.100.2
(公共 IP 为10.123.123.9
),而vm-node-2
的专用 IP 为10.0.200.12
(公共 IP 为10.123.123.99
),则我们最初可以获取vm-node-1
和vm-node-2
来交换其公共 IP (10.123.123.x
)。-
他们搜索和交换的配置包含
10.0.x.x
IP(其专用 IP 地址)。 -
因此,如果
vm-node-1
尝试使用vm-node-2
的专用 IP (10.0.200.12
) 进行通信(这是非本地目标),则流量将推送到外部网络。 -
外部网络可能不知道如何处理
10.0.200.12
,也可能完全路由到其他位置,而不是托管在其他 Oracle Roving Edge Infrastructure 节点上的预期目标 VM 实例。这就是 Open MPI 通信包丢失的方式。 -
请记住,
10.0.200.12
在 Oracle Roving Edge Infrastructure 节点上托管的虚拟实例 IP 上是专用的,外部网络不知道如何将专用 IP 地址映射回 VM 实例。 -
外部网络仅知道
10.123.123.99
(vm-node-2
的公共 IP),该 IP 将定向到目标 Oracle Roving Edge Infrastructure 节点,然后该节点将转换地址并将流量发送到正确的 VM 实例。
-
在 Oracle Roving Edge Infrastructure 上实施开放式 MPI
为了解决 Oracle Roving Edge Infrastructure 内部网络的非共享性问题,Linux VM 实例上的 Netfilter 软件用于重写来自其他 Oracle Roving Edge Infrastructure 节点上托管的 VM 的网络数据包。
设计注意事项
在本教程中,三个 Oracle Roving Edge Infrastructure Roving Edge 设备 (RED) 节点用于创建开放 MPI 集群。所有 RED 都连接到共享外部网络。每个节点都配置有自己的外部 IP 池以分配给 VM 实例。
-
RED 的外部网络仍然是 RFC1918 中的专用网络。
-
每个 RED 都配置有一个 VCN。在此用例中,VCN 使用的是
10.0.0.0/16
的 CIDR。 -
对于要使用的子网,每个 RED 都具有不同的 CIDR。使用不同的子网 CIDR 可简化设置,并确保不同 RED 上的 VM 之间不会发生 IP 冲突。
VCN 和子网 CIDR 表
RED 名称 | VCN CIDR | 子网 CIDR |
---|---|---|
RED1 | 10.0.0.0/16 | 10.0.1.0/24 |
RED2 | 10.0.0.0/16 | 10.0.2.0/24 |
RED3 | 10.0.0.0/16 | 10.0.3.0/24 |
下图显示了此示例,其中两个网络配置来自两个不同的 RED。
目标读者
Oracle Roving Edge Infrastructure 管理员、开发人员和用户。
目标
-
在 Oracle Roving Edge Infrastructure 上实施开放式 MPI。
-
在使用具有多个 Oracle Roving Edge Infrastructure 节点的 Open MPI 时,了解警告。
-
使用 Open MPI 演示跨多个 Oracle Roving Edge Infrastructure 节点的并行处理。
先决条件
-
访问一个或多个 Oracle Roving Edge Infrastructure 节点 webUI,本教程中的示例使用 3 个 Oracle Roving Edge Infrastructure 设备 (RED)。
-
对 Oracle Roving Edge Infrastructure 的用户权限,用于创建和启动实例。有关详细信息,请参阅 Roving Edge 基础设施的计算权限。
-
在每个 Oracle Roving Edge Infrastructure 节点上设置虚拟云网络 (VCN)。有关详细信息,请参阅为 Roving Edge 基础设施设备创建 VCN 。
-
在具有公共 IP 地址的每个 Oracle Roving Edge Infrastructure 节点上设置子网。有关更多信息,请参见 Creating a Subnet for a Roving Edge Infrastructure Device 。
-
了解如何将定制计算映像导入 Oracle Roving Edge Infrastructure。有关详细信息,请参阅在 OCI 计算中管理定制映像和将定制映像从存储桶导入 Roving Edge 基础设施设备。
-
设置在 Oracle Roving Edge Infrastructure 节点上运行的实例,并通过 SSH 访问这些节点,请参阅为 Roving Edge 基础设施设备创建实例。
-
基本了解 Oracle Linux,用于通过 SSH 连接到实例、使用 IP 表、服务、编辑文件、运行 shell 脚本、更改目录、安装软件、使用软件包系统信息库以及使用代理服务器。
任务 1:创建虚拟机实例
在每个 RED 上的每个子网中创建 VM 实例。
IP 地址分配示例:
RED 名称 | VM 名称 | VM O/S | VM 专用 IP | VM 公共 IP |
---|---|---|---|---|
RED1 | redvm1 | Ubuntu 22.04 | 10.0.1.2/24 | 10.123.123.32 |
RED2 | redvm2 | Ubuntu 22.04 | 10.0.2.2/24 | 10.123.123.67 |
RED3 | redvm3 | Ubuntu 22.04 | 10.0.3.2/24 | 10.123.123.101 |
注:此任务中的 VM 实例是使用使用 OCI Ubuntu
22.04
LTS 从 Oracle Cloud Infrastructure (OCI) 导出的映像创建的。可以使用任何具有合适 Open MPI 程序包的 Linux 发行版,例如 Oracle Linux 8 或 9、Fedora 等。
-
在每个 RED 上,导航到计算、实例,然后单击创建实例。
-
在创建计算实例中,输入名称,选择导入的定制映像、配置、配置网络、 SSH 密钥,然后单击创建。
任务 2:在每个 VM 实例上安装打开的 MPI 软件包
创建所有 VM 实例后,使用预配期间提供的密钥通过 SSH 登录到每个 VM 实例。以下命令适用于 Ubuntu 22.04
,如果您使用的是其他 Linux 发行版,则可能需要调整这些说明或包括其他软件包系统信息库。
-
运行以下命令以更新系统并重新引导。
sudo apt update && sudo apt upgrade -y
这可能需要一段时间才能完成。完成后,重新引导实例。
sudo shutdown -r now
-
登录到实例并安装 Open MPI 软件包。
注:
-
这将通过相当多的依赖。
-
libopenmpi-dev
软件包仅在以后编译要测试的样例程序时才需要。如果您不打算将 Open MPI 功能编译为程序,则不需要此软件包。
sudo apt install openmpi-bin libopenmpi-dev -y
-
任务 3:设置目标网络地址转换 (DNAT) 和源网络地址转换 (SNAT)
-
查看启动的每个 VM 实例的详细信息,并记下随机分配的专用公共 IP 地址。导航到计算、实例,然后单击实例名称以查看详细信息。
-
创建 SNAT。
-
如果为表中的每个 VM 映射 SNAT 规则,应如下所示:
信噪比 来自 RED1 来自 RED2 来自 RED3 关于 redvm1
N/A 输入 src 10.123.123.67 SNAT to src 10.0.2.2
输入 src 10.123.123.101 SNAT to src 10.0.3.2
关于 redvm2
输入 src 10.123.123.32 SNAT to src 10.0.1.2
N/A 输入 src 10.123.123.101 SNAT to src 10.0.3.2
关于 redvm3
输入 src 10.123.123.32 SNAT to src 10.0.1.2
输入 src 10.123.123.67 SNAT to src 10.0.2.2
N/A -
对每个 VM 使用
iptables
命令。-
在
redvm1
上。sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access." sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.67 -j SNAT --to-source 10.0.2.2 sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.101 -j SNAT --to-source 10.0.3.2 sudo netfilter-persistent save
-
在
redvm2
上。sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access." sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.32 -j SNAT --to-source 10.0.1.2 sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.101 -j SNAT --to-source 10.0.3.2 sudo netfilter-persistent save
-
在
redvm3
上。sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access." sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.32 -j SNAT --to-source 10.0.1.2 sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.67 -j SNAT --to-source 10.0.2.2 sudo netfilter-persistent save
注:添加了第一个规则 (
sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT
),以允许 RED 用于其公共 IP 的子网进行访问。如果没有此(或类似规则),接收 RED 可能会丢弃从 RED 到 RED 的入站流量。在这些 VM 上,新规则使用sudo netfilter-persistent save
持久保存,但是,如果您使用的是其他 Linux 发行版,则此命令可能是其他命令。 -
-
-
创建 DNAT。
-
同样,如果为表中的每个 VM 映射 DNAT 规则,则应如下所示:
DNAT 转至 RED1 转至 RED2 转至 RED3 关于 redvm1
N/A 输出 dst 10.0.2.2 DNAT to dst 10.123.123.67
输出 dst 10.0.3.2 DNAT to dst 10.123.123.101
关于 redvm2
输出 dst 10.0.1.2 DNAT to dst 10.123.123.32
N/A 输出 dst 10.0.3.2 DNAT to dst 10.123.123.101
关于 redvm3
输出 dst 10.0.1.2 DNAT to dst 10.123.123.32
输出 dst 10.0.2.2 DNAT to dst 10.123.123.67
N/A -
对每个 VM 使用
iptables
命令。-
在
redvm1
上。sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.2.2 -j DNAT --to-destination 10.123.123.67 sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.3.2 -j DNAT --to-destination 10.123.123.101 sudo netfilter-persistent save
-
在
redvm2
上。sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.1.2 -j DNAT --to-destination 10.123.123.32 sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.3.2 -j DNAT --to-destination 10.123.123.101 sudo netfilter-persistent save
-
在
redvm3
上。sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.1.2 -j DNAT --to-destination 10.123.123.32 sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.2.2 -j DNAT --to-destination 10.123.123.67 sudo netfilter-persistent save
注:在 VM 实例上,新规则使用
sudo netfilter-persistent save
持久保存。 -
-
任务 4:设置打开的 MPI
Open MPI 使用 SSH 在群集成员之间进行通信,因此,在我们运行作业之前,需要注意一些事项。
-
Open MPI 将使用每个 VM 的专用 IP 地址,在每个 Open MPI VM 实例上为每个 VM 实例创建
/etc/hosts
条目及其专用 IP 地址。例如,使用
redvm1
上的/etc/hosts
条目上方的配置将包含以下条目:127.0.0.1 localhost 127.0.1.1 redvm1 redvm1 10.0.2.2 redvm2 10.0.3.2 redvm3
在
redvm2
上,/etc/hosts
将包含以下条目:127.0.0.1 localhost 127.0.1.1 redvm2 redvm2 10.0.1.2 redvm1 10.0.3.2 redvm3
在
redvm3
上,/etc/hosts
将包含以下条目:127.0.0.1 localhost 127.0.1.1 redvm3 redvm3 10.0.1.2 redvm1 10.0.2.2 redvm2
-
我们还需要确保每个 VM 之间存在 SSH 等同项,以供 Open MPI 使用。
注:此处的假设是,这些新 VM 不包含 Ubuntu 用户的现有 SSH 密钥。如果您使用已创建 SSH 密钥的较旧 VM,则需要调整这些说明,这些说明可能会覆盖现有密钥并锁定您的 VM。
-
在
redvm1
上,创建新的公钥或私钥对(如果尚未创建密钥)。使用类似于ssh-keygen -b 4096 -t rsa
的ssh-keygen
命令(接受默认值,不要为新密钥设置密码)。这将生成~/.ssh/id_rsa
和~/.ssh/id_rsa.pub
。 -
通过执行
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
或通过文本编辑器手动复制新公钥,将新公钥添加到authorized_keys
文件。 -
将
id_rsa
和id_rsa.pub
复制到redvm2
和redvm3
上ubuntu
用户的~/.ssh
目录。确保将id_rsa.pub
添加到authorized_keys
,在redvm2
和redvm3
上运行cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
。 -
完成此操作后,从每个 VM 连接到所有其他 VM(包括 VM 本身),以确保连接正常运行并且 SSH 信任其他主机。
-
redvm1
上的 SSH 连接。ubuntu@redvm1:~$ ssh redvm1 date The authenticity of host 'redvm1 (127.0.1.1)' can't be established. ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'redvm1' (ED25519) to the list of known hosts. Fri Apr 5 04:28:57 UTC 2024 ubuntu@redvm1:~$ ubuntu@redvm1:~$ ssh redvm2 date The authenticity of host 'redvm2 (10.0.2.2)' can't be established. ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'redvm2' (ED25519) to the list of known hosts. Wed Jan 31 04:29:11 UTC 2024 ubuntu@redvm1:~$ ubuntu@redvm1:~$ ssh redvm3 date The authenticity of host 'redvm3 (10.0.3.2)' can't be established. ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'redvm3' (ED25519) to the list of known hosts. Wed Jan 31 04:29:19 UTC 2024
-
-
重复上述步骤,将
redvm2
连接到redvm2
、redvm1
和redvm3
,将redvm3
连接到redvm3
、redvm1
和redvm2
。
-
-
为每个群集成员创建公用存储位置。
注:理想情况下,使用 Open MPI 的所有 VM 实例都将具有共享存储位置。这可能采用 NFS、GlusterFS、OCFS2 或任何其他共享文件系统解决方案的形式。如果工作负载需要通用工作目录或数据集,这一点尤其重要。
此示例不需要共享文件系统,只需要一个具有测试二进制文件通用名称的位置。在每个 VM 上,创建通用名称位置
/mpitest
。sudo mkdir /mpitest && sudo chown ubuntu:ubuntu /mpitest
如果使用共享文件系统,则共享文件系统将在所有 VM 实例上的此位置挂载。
-
创建
hostfile
以与mpirun
一起使用。有关更多信息,请参见 How do I use the -hostfile option to mpirun?。-
我们将创建两个
hostfiles
进行测试。在redvm1
上,使用上面创建的通用名称位置/mpitest
,创建包含以下内容的文件/mpitest/mpihosts.txt
:redvm1 redvm2 redvm3
-
使用以下内容创建文件
/mpitest/mpihosts_slots.txt
:redvm1 slots=1 redvm2 slots=1 redvm3 slots=1
-
注:在本教程中,测试仅从
redvm1
运行,因此我们不需要将这些文件复制到redvm2
和redvm3
。如果您也希望从其他 VM 运行作业,则需要将这些文件复制到其他 VM 实例,或者使用正确的共享文件系统(如 NFS)。
任务 5:测试 VM 实例
-
对分布式命令的简单测试。
-
简单的测试只是针对所有群集成员调用
hostname
等命令。下面是运行在具有slots=1
(mpihosts_slots.txt
) 文件的三个节点上的预期输出。slots
指令通知mpirun
可以分配给此节点的进程数,而不是用于确定进程数的mpirun
。注:如果使用 CPU 以外的有限资源(例如 GPU),则可能需要指定
slots
,您希望将进程限制为其他资源的数量。如果不这样做,可能会导致进程由于无法分配其他资源而失败。ubuntu@redvm1:~$ cd /mpitest ubuntu@redvm1:/mpitest$ cat mpihosts_slots.txt redvm1 slots=1 redvm2 slots=1 redvm3 slots=1 ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts_slots.txt hostname redvm1 redvm2 redvm3
-
运行相同的测试,但不指定
slots
(mpihosts.txt
) 文件,mpirun
将确定可用的 CPU,并在每个节点上运行 CPUhostname
命令的数量。这三个 VM 具有 16 个 CPU,因此我们应该得到 3 x 16 个响应(每个主机名中有 16 个)。ubuntu@redvm1:/mpitest$ cat mpihosts.txt redvm1 redvm2 redvm3 ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts.txt hostname | sort | uniq -c 16 redvm1 16 redvm2 16 redvm3
-
-
构建 Open MPI 测试二进制文件。
对于使用 Open MPI 的程序进行适当的测试,我们使用 John Burkardt 的素数计算器示例。这需要下载并编译在
redvm1
上。有关更多信息,请参阅 Prime Number Calculator by John Burkardt 。ubuntu@redvm1:~$ cd /mpitest ubuntu@redvm1:/mpitest$ curl https://people.sc.fsu.edu/~jburkardt/c_src/prime_mpi/prime_mpi.c -o prime_mpi.c % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 4699 100 4699 0 0 2990 0 0:00:01 0:00:01 --:--:-- 2991 ubuntu@redvm1:/mpitest$ mpicc prime_mpi.c -o prime_mpi ubuntu@redvm1:/mpitest$ ls -l prime_mpi -rwxrwxr-x 1 ubuntu ubuntu 16736 Apr 5 05:38 prime_mpi
由于未设置共享文件系统进行测试,因此需要将
prime_mpi
二进制文件复制到redvm2
和redvm3
,其位置与redvm1
上的位置相同。运行以下命令。ubuntu@redvm1:/mpitest$ scp prime_mpi redvm2:/mpitest prime_mpi 100% 16KB 27.4MB/s 00:00 ubuntu@redvm1:/mpitest$ scp prime_mpi redvm3:/mpitest prime_mpi 100% 16KB 28.3MB/s 00:00
-
要比较基线,请独立运行 Open MPI 二进制文件。在未打开 MPI 的情况下运行
prime_mpi
以进行基线或比较。ubuntu@redvm1:/mpitest$ ./prime_mpi 31 January 2024 06:08:17 AM PRIME_MPI C/MPI version An MPI example program to count the number of primes. The number of processes is 1 N Pi Time 1 0 0.000003 2 1 0.000000 4 2 0.000000 8 4 0.000000 16 6 0.000000 32 11 0.000001 64 18 0.000002 128 31 0.000022 256 54 0.000019 512 97 0.000066 1024 172 0.000231 2048 309 0.000810 4096 564 0.002846 8192 1028 0.010093 16384 1900 0.037234 32768 3512 0.137078 65536 6542 0.515210 131072 12251 1.932970 262144 23000 7.243419 PRIME_MPI - Master process: Normal end of execution. 31 January 2024 06:08:27 AM
注:进程数为 1,完成大约需要 10 秒。
-
使用 Open MPI 的分布式运行。使用
mpihosts.txt
文件在三个 VM 实例上的所有可用 CPU 上使用 Open MPI 运行prime_mpi
。ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts.txt ./prime_mpi 31 January 2024 06:09:02 AM PRIME_MPI C/MPI version An MPI example program to count the number of primes. The number of processes is 48 N Pi Time 1 0 0.020740 2 1 0.000428 4 2 0.000331 8 4 0.000392 16 6 0.000269 32 11 0.000295 64 18 0.000374 128 31 0.000390 256 54 0.000380 512 97 0.000331 1024 172 0.000351 2048 309 0.000385 4096 564 0.000740 8192 1028 0.001931 16384 1900 0.006316 32768 3512 0.021577 65536 6542 0.078834 131072 12251 0.273368 262144 23000 0.808825 PRIME_MPI - Master process: Normal end of execution. 31 January 2024 06:09:03 AM
使用了 48 个进程,运行大约需要 1 秒钟。
通过运行相同的示例(但使用
mpihosts_slots.txt
文件)浏览 Open MPI。与单独运行prime_mpi
相比,您应该看到有所改进,但它在每个节点上仅使用 1 个处理器(共 3 个),而不是在所有节点上使用完整补充。通过更改每个 VM 实例上的插槽数,您可以控制作业的分配。
相关链接
确认
- Authors - James George(首席云架构师),Melinda Centeno(高级首席产品经理)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Use Open MPI on Oracle Roving Edge Infrastructure
F96275-01
April 2024