在 Compute Engine 中計算 Pi

1. 簡介

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

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

您將建立 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 未使用的字元字串。您隨時可以更新這項資訊。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為 PROJECT_ID)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。此外,您也可以自行嘗試,看看系統是否提供該付款方式。在完成這個步驟後就無法變更,而且在專案期間仍會保持有效。
  • 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免系統產生本教學課程結束後產生的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

Google Cloud Shell

雖然 Google Cloud 和 Compute Engine 可以在筆記型電腦上遠端運作,但在本程式碼研究室中,我們會使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。

這種以 Debian 為基礎的虛擬機器,搭載各種您需要的開發工具。提供永久的 5 GB 主目錄,而且在 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 後,您應會發現自己通過驗證,且專案已設為 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 指令列工具建立虛擬機器。如有需要,您也可以使用主控台,但指令列較容易重複說明及解釋。

首先,建立一個名為 pi-codelab 的 n2-standard-2 執行個體,並使用 Debian 11 做為作業系統。我們也會使用平衡永久磁碟 (PD) 做為開機磁碟區。平衡 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

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

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 程式會使用一個引數,也就是要計算的位數。比方說,我們要計算圓周率的前 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 位小數。恭喜!您剛剛是由電腦為您完成數學。

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

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。

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

我們可以查看 pi10m.txt 並查看每個數字的前 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 千萬位數 pi 數字!

我們在 2022 年使用相同的基礎架構來計算圓周率的 100 兆位數。歡迎參閱公告,瞭解我們的表現。您可以前往 pi.delivery 示範網站,取得完整結果。

歡迎參閱 Google Cloud 網誌,即時掌握 ComputeHigh Performance Computing 的最新消息!

其他 Compute Engine 功能

Compute Engine 提供一組豐富的功能,您也許可以進一步瞭解下列這些原因:

請提供您寶貴的意見