在 Compute Engine 中計算 Pi

1. 簡介

感謝您開啟本程式碼研究室!準備好在 Compute Engine 上處理一些數字了嗎?

在本程式碼研究室中,我們將逐步說明如何啟動新的虛擬機器,並執行計算 pi 的程式。

您將建立 Compute Engine 執行個體,然後下載、編譯及執行程式來計算圓周率。您可以透過主控台或指令列建立 Compute Engine 執行個體。本實驗室將逐步說明如何使用指令列工具。

ComputeEngine_128px.png

Compute Engine 提供各種形狀的虛擬機器,例如不同數量的核心、記憶體大小和儲存空間。如有需要,您可以使用超過 100 個核心和數百 GB 記憶體的機器,但在此範例中,我們將啟動預先定義的 2 個 vCPU、8 GB 記憶體虛擬機器。

在本程式碼研究室中,我們將使用 N2 系列機器。這是適用於大多數標準和雲端原生工作負載的一般用途機器系列 VM。N2 系列的每執行緒效能較高,且具備一般用途機器系列的所有彈性。

現在就開始吧!

2. 設定和需求

自修實驗室環境設定

  1. 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串。你隨時可以更新該位置資訊。
  • 專案 ID 在所有 Google Cloud 專案中都是不重複的,而且設定後即無法變更。Cloud 控制台會自動產生不重複的字串,通常您不需要在意這個字串。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為 PROJECT_ID)。如果您不喜歡產生的 ID,可以產生另一個隨機 ID。你也可以嘗試自訂名稱,看看是否可用。完成這個步驟後就無法變更,且專案期間都會維持這個設定。
  • 請注意,部分 API 會使用第三個值,也就是「專案編號」。如要進一步瞭解這三種值,請參閱說明文件
  1. 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成本程式碼研究室的費用應該不高,甚至完全免費。如要關閉資源,避免產生本教學課程以外的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。

Google Cloud Shell

雖然可以透過筆電遠端操作 Google Cloud 和 Compute Engine,但在本程式碼研究室中,我們將使用 Google Cloud Shell,這是可在雲端執行的指令列環境。

這部以 Debian 為基礎的虛擬機器,搭載各種您需要的開發工具,並提供永久的 5GB 主目錄,而且可在 Google Cloud 運作,大幅提升網路效能並強化驗證功能。也就是說,您只需要瀏覽器 (Chromebook 也可以) 就能完成本程式碼研究室。

  1. 如要從 Cloud 控制台啟用 Cloud Shell,只要按一下「啟用 Cloud Shell」 b125d9eb26a46cc5.png 即可 (佈建並連線至環境的作業需要一些時間才能完成)。

1067942a9a93f70.png

Screen Shot 2017-06-14 at 10.13.43 PM.png

連至 Cloud Shell 後,您應該會看到驗證已完成,專案也已設為獲派的專案 ID PROJECT_ID

gcloud auth list

指令輸出

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

指令輸出

[core]
project = <PROJECT_ID>

如果專案未設定,請發出下列指令:

gcloud config set project <PROJECT_ID>

在尋找「PROJECT_ID」嗎?請檢查您在設定步驟中使用的 ID,或在 Cloud 控制台資訊主頁中尋找:

cc3895eeac80db2c.png

Cloud Shell 也會預設設定部分環境變數,這些變數在您執行後續指令時可能很有用。

echo $GOOGLE_CLOUD_PROJECT

指令輸出

<PROJECT_ID>
  1. 最後,設定預設可用區和專案。
gcloud config set compute/zone us-central1-f

你可以選擇各種不同區域。詳情請參閱「地區和區域」。

3. 建立 Compute Engine 執行個體

首先,我們將使用 gcloud 指令列工具建立虛擬機器。您也可以使用 Console,但命令列更容易重複使用和說明。

首先,請建立名為 pi-codelab 的 n2-standard-2 執行個體,並將作業系統設為 Debian 11。我們也會使用平衡型永久磁碟 (PD) 做為開機磁碟區。平衡型永久磁碟是以固態硬碟 (SSD) 備份,效能與成本兼具。如果你未在「設定和需求條件」部分選取預設區域,系統會詢問要使用哪個區域。

gcloud compute instances create pi-codelab \
--machine-type=n2-standard-2 \
--image-project=debian-cloud \
--image-family=debian-11 \
--boot-disk-type=pd-balanced

指令結果應如下所示:

Created [https://www.googleapis.com/compute/v1/projects/xxx/zones/us-central1-f/instances/pi-codelab].
NAME: pi-codelab
ZONE: us-central1-f
MACHINE_TYPE: n2-standard-2
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.XX
EXTERNAL_IP: XX.XX.XX.XX
STATUS: RUNNING

請注意,每次建立新的 VM 時,INTERNAL_IP 和 EXTERNAL_IP 欄位都會變更。

如要進一步瞭解 gcloud compute instances create 指令,請參閱參考頁面

4. 透過 SSH 登入執行個體

如要透過指令列以 SSH 連線至執行個體,請執行下列指令。

gcloud compute ssh pi-codelab

大功告成!現在您已進入虛擬機器。執行 hostname 指令即可確認目前的主機。

hostname

這項指令會顯示目前殼層環境的主機名稱。

pi-codelab

5. 安裝依附元件

現在我們要安裝編譯程式所需的依附元件,以計算圓周率。

sudo apt update
sudo apt -y install build-essential libgmp-dev libmpfr-dev libfmt-dev

這個程序需要幾分鐘才能完成。現在,請檢查您是否擁有可正常運作的 C++ 編譯器。

c++ --version

如果編譯器已正確安裝,這個指令會輸出編譯器的版本資訊。

c++ (Debian 10.2.1-6) 10.2.1 20210110
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

6. 編譯程式

現在來編譯 C++ 程式,計算圓周率。即使您先前未曾使用 C++ 開發,這項作業也比想像中簡單。上一個步驟已安裝所有必要條件,因此我們只需要擷取並編譯原始碼。

首先,請擷取並儲存原始碼。這個步驟會從 GitHub 下載來源檔案,並以 pi.cc 的名稱儲存至目前目錄。

curl -OL https://raw.githubusercontent.com/GoogleCloudPlatform/pi-delivery/main/codelab/pi.cc

接著,執行 C++ 編譯器來編譯儲存的原始碼。

c++ -opi pi.cc -std=c++17 -O3 -march=native -lgmp -lmpfr -lpthread -lfmt

如果編譯成功,編譯器不會輸出任何內容。請確認您擁有可執行檔:

ls pi

如果程式存在,這項 ls 指令應會輸出程式的檔案名稱。

pi

7. 計算 Pi

pi 程式會採用一個引數,也就是要計算的位數。舉例來說,讓我們計算圓周率的前 100 位小數。

./pi 100

程式會在不到一秒內完成,並輸出類似下列內容:

Calculating 100 digits of pi...
Internal precision = 348 bits
Number of terms = 9, digits per term = 14.181647462725477
Summation series complete. Final steps...
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

最後一行是圓周率的前 100 位小數。恭喜,您剛才讓電腦為您計算數學!

程式可計算更多位數 (目前上限為 1,000 億位數)。現在來計算 1 千萬位數,並測量所需時間。由於圓周率的 1 千萬位數太長,無法在指令列控制台中查看,因此我們會將輸出內容重新導向至檔案。

time ./pi 10000000 > pi10m.txt

程式會輸出類似下列內容:

Calculating 10000000 digits of pi...
Internal precision = 33219296 bits
Number of terms = 705138, digits per term = 14.181647462725477
Summation series complete. Final steps...

real    0m9.702s
user    0m14.839s
sys     0m0.364s

這次不會包含數字,因為這些數字已儲存在 pi10m.txt 檔案中。最後三行說明程式的執行時間和 CPU 使用量。

  • 實際時間:從開始到結束的實際時間,也就是說,在上述範例中,計算 1 千萬位數的圓周率花了 9.7 秒。
  • 使用者:使用的 CPU 時間量,大於「實際」時間,因為機器有兩個 CPU 核心,每個核心都會計入總數。
  • sys:作業系統執行程式處理系統工作 (例如網路和 I/O) 所需的時間。這次大約花了 0.4 秒,這主要是將結果寫入磁碟的時間。

我們可以查看 pi10m.txt,看看前 100 位和後 100 位數字。

先檢查前幾位數。這個指令會輸出前 100 個十進位數 (以及前 3 個和十進位數)。

head -c 102 pi10m.txt

結果應如下所示。

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

下一個指令會輸出最後 100 個十進位數。

tail -c 100 pi10m.txt

結果應如下所示。

610515549257985759204553246894468742702504639790565326553194060999469787333810631719481735348955897

8. 清除叢集

別忘了關閉 Compute Engine 執行個體,否則執行個體會持續運作並產生費用。

如果您位於 VM 上 (透過 SSH 連線),請先執行 exit 指令登出。

exit

然後執行下列 gcloud compute instances delete 指令,刪除執行個體和相關聯的磁碟。系統會要求您確認是否要刪除資源。

gcloud compute instances delete pi-codelab

9. 接下來要做什麼?

恭喜!您已完成本 Compute Engine 程式碼研究室,並計算出圓周率的 1 千萬位數!

我們在 2022 年使用相同的基礎架構,計算出圓周率的 100 兆個位數。請參閱公告,瞭解我們如何達成這項目標。如要查看完整結果,請前往 pi.delivery 示範網站。

歡迎前往 Google Cloud 網誌,隨時掌握 Compute高效能運算的最新消息!

更多 Compute Engine 功能

Compute Engine 提供豐富的功能,建議您深入瞭解下列主題:

提供意見