附註:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱開始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 憑證、租用戶及區間的範例值。完成實驗室時,請將這些值取代為您雲端環境特有的值。
在 Oracle Roving Edge Infrastructure 上使用開放式 MPI
簡介
Oracle Roving Edge Infrastructure 是一個堅固耐用的雲端運算和儲存平台,適合在網路邊緣部署,或在有限或沒有外部連線的位置部署。隨著更大、更複雜且高要求的負載移轉至網路邊緣,這可能會對邊緣基礎架構帶來挑戰。
開放 MPI 是「訊息傳送介面 (MPI)」標準的實作,用於在高效能運算 (HPC) 中開發平行應用程式。開放式 MPI 可用於在相對較小的基礎架構中部署高效能運算和高平行工作負載,然後以較大、聚總的一組資源方式運作。此方法可用來將工作負載分配給 CPU 和其他運算資源 (例如 GPU),以便在網路邊緣部署大型、運算密集的工作,例如預測模型或其他人工智慧 / 機器學習 (AI/ML) 工作。
開放式 MPI 可用來在 Oracle Roving Edge Infrastructure 節點上利用資源部署平行工作負載。Netfilter 使用跨 Oracle Roving Edge Infrastructure 節點代管的叢集軟體,為 VM 執行處理提供必要的目的地網路位址轉譯 (DNAT) 和來源網路位址轉譯 (SNAT)。本教學課程在 Oracle Roving Edge Infrastructure 上使用 Netfilter 實作 Open MPI,以執行質數計算器來示範使用平行資源時的效能提升。
背景資訊
開啟的 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 位址。這些位址可以是可從網際網路連線的 IPv4 位址,也可以是區域網路之專用子網路上的位址。這些位址也稱為外部 IP 位址,因為它們可以連線到代管 VM 執行處理之節點外部的資源。
請務必瞭解在 Oracle Roving Edge Infrastructure 節點內執行的 VM 執行處理何時嘗試存取節點外部的資源,流量會通過外部 IP 位址 (在節點內路由並輸出至外部網路連線)。
-
VM 所使用的專用 IP 位址是由代管 Oracle Roving Edge Infrastructure 節點轉譯為從公用 IP 位址集區指派的公用 (外部) IP 位址。
-
網路流量會從代管 Oracle Roving Edge Infrastructure 節點上的 VM 執行處理傳輸至外部網路,這實際上是 1:1 網路位址轉譯 (NAT)。
-
VM 執行處理有公用 (外部) IP 位址,但 VM 執行處理本身絕不會看到該 IP 位址。
-
另一方面,使用其指定之公用 (外部) IP 位址的 VM 執行處理外部流量會移至代管的 Oracle Roving Edge Infrastructure 節點,此節點會將公用 (外部) IP 位址轉譯為目的地 VM 執行處理的關聯專用 IP 位址。
下列影像顯示 Oracle Roving Edge Infrastructure 節點上的 VM 執行處理範例,注意指定的公用 IP 位址和專用 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 位址,並向叢集中的其他節點註冊這些 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 執行處理。這是開啟的 MPI 通訊封包遺失的方式。 -
請記住,在 Oracle Roving Edge Infrastructure 節點上代管的虛擬實例 IP 上,
10.0.200.12
是專用的,外部網路不知道如何將專用 IP 位址對應回 VM 實例。 -
外部網路只知道將導向目的地 Oracle Roving Edge Infrastructure 節點的
10.123.123.99
(vm-node-2
的公用 IP),然後會轉譯位址並將流量傳送至正確的 VM 執行處理。
-
在 Oracle Roving Edge Infrastructure 導入開放式 MPI
為了因應 Oracle Roving Edge Infrastructure 內部網路的非共用性質,Linux VM 執行處理上的 Netfilter 軟體可用來重寫來自其他 Oracle Roving Edge Infrastructure 節點上代管之 VM 的網路封包,並銷毀這些封包。
設計考量
在本教學課程中,會使用三個 Oracle Roving Edge Infrastructure Roving Edge Devices (RED) 節點來建立 Open 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 Infrastructure 的運算權限。
-
在每個 Oracle Roving Edge Infrastructure 節點上設定虛擬雲端網路 (VCN)。如需詳細資訊,請參閱建立 Roving Edge Infrastructure 裝置的 VCN 。
-
在每個具有公用 IP 位址的 Oracle Roving Edge Infrastructure 節點上設定子網路。如需詳細資訊,請參閱建立 Roving Edge Infrastructure 裝置的子網路。
-
瞭解如何將自訂運算映像檔匯入 Oracle Roving Edge Infrastructure。如需詳細資訊,請參閱管理 OCI Compute 中的自訂映像檔和將自訂映像檔從儲存桶匯入至 Roving Edge Infrastructure 裝置。
-
設定在 Oracle Roving Edge Infrastructure 節點上執行的執行處理,並透過 SSH 存取這些節點,請參閱建立 Roving Edge Infrastructure 裝置的執行處理。
-
對 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 規則對應,看起來應該如下:
SNAT 由 RED1 提供 由 RED2 提供 由 RED3 提供 在 redvm1
無 輸入 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
無 輸入 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
無 -
針對每個 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
無 輸出 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
無 輸出 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
無 -
針對每個 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
開啟 MPI 會使用 SSH 在叢集成員之間進行通訊,因此在執行工作之前,必須先處理一些事項。
-
開啟的 MPI 將使用每個 VM 的專用 IP 位址,在每個開啟的 MPI VM 執行處理上,為每個 VM 執行處理和其專用 IP 位址建立
/etc/hosts
項目。例如,使用
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。
注意:此處的假設這些是未包含 Ubuntu 使用者現有 SSH 金鑰的新 VM。如果您使用的是已經建立 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
搭配使用。如需詳細資訊,請參閱如何使用 -hostfile 選項來 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 執行prime_mpi
(含開啟 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 秒。
執行相同的範例來探索 Open MPI,但使用
mpihosts_slots.txt
檔案。與獨立執行prime_mpi
相較之下,您應該有所改善,但每個節點上只會使用 1 個處理器 (總計 3 個),而不是所有節點上的完整補數。藉由變更每個 VM 執行處理上的槽位數目,您可以控制工作的分配。
相關連結
認可
- 作者 - Melinda Centeno (資深首席產品經理) James George (首席雲端架構師)
其他學習資源
瀏覽 docs.oracle.com/learn 的其他實驗室,或前往 Oracle Learning YouTube 頻道存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Use Open MPI on Oracle Roving Edge Infrastructure
F96276-01
April 2024