在 Compute Engine 上计算 Pi

1. 简介

感谢您打开此 Codelab!准备好在 Compute Engine 上处理一些数据了吗?

在此 Codelab 中,我们将逐步介绍如何启动新的虚拟机并运行程序来计算 pi。

您将创建一个 Compute Engine 实例,然后下载、编译并运行一个用于计算 Pi 的程序。您可以通过控制台或命令行创建 Compute Engine 实例。本实验将引导您使用命令行工具。

ComputeEngine_128px.png

Compute Engine 提供以各种配置运行的虚拟机,例如不同的核心数、内存大小和存储空间。如有必要,您可以使用具有 100 多个核心和数百 GB 内存的机器,但在此示例中,我们将启动预定义的 2 个 vCPU、8 GB 内存虚拟机。

在此 Codelab 中,我们将使用 N2 机器系列。它是一种通用机器系列虚拟机,适用于大多数标准工作负载和云原生工作负载。N2 系列具有更高的每线程性能,同时还能受益于通用机器系列提供的所有灵活性。

现在,让我们开始吧!

2. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时更新。
  • 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用 PROJECT_ID 标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。
  • 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除整个项目。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。

Google Cloud Shell

虽然 Google Cloud 和 Compute Engine 可以从笔记本电脑远程操作,但在此 Codelab 中,我们将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

基于 Debian 的这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。这意味着在本 Codelab 中,您只需要一个浏览器(没错,它适用于 Chromebook)。

  1. 如需从 Cloud Console 激活 Cloud Shell,只需点击激活 Cloud Shellb125d9eb26a46cc5.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 Console 信息中心查找该 ID:

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) 作为启动卷。平衡永久性磁盘由固态硬盘 (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

请注意,每次创建新虚拟机时,INTERNAL_IP 和 EXTERNAL_IP 字段都会发生变化。

如果您想详细了解 gcloud compute instances create 命令,请访问参考页面

4. 通过 SSH 连接到实例

如需通过 SSH 从命令行登录到实例,请运行以下命令。

gcloud compute ssh pi-codelab

大功告成!现在,您已进入虚拟机。您可以运行 hostname 命令来确认当前主机。

hostname

该命令将显示当前 shell 环境的主机名。

pi-codelab

5. 安装依赖项

现在,我们将安装编译程序以计算 pi 所需的依赖项。

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++ 程序以计算 pi。即使您之前没有使用 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,000 万位数字,并测量所需的时间。我们将输出重定向到一个文件,因为 1000 万位圆周率在命令行控制台中查看有点太长了。

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, 000 万位圆周率用了 9.7 秒。
  • 用户:使用的 CPU 时间,该时间大于“实际”时间,因为机器有 2 个 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 实例,否则它会继续运行并产生费用。

如果您位于虚拟机上(已通过 SSH 连接),请先运行 exit 命令以退出。

exit

然后,运行以下 gcloud compute instances delete 命令以删除实例和关联的磁盘。系统会要求您确认是否要删除资源。

gcloud compute instances delete pi-codelab

9. 接下来做什么?

恭喜,您已完成此 Compute Engine Codelab,并计算了圆周率的 1, 000 万位数字!

我们于 2022 年使用同一基础架构计算了圆周率的 100 万亿位。请阅读通知,了解我们的做法。您可以在我们的 pi.delivery 演示网站上查看完整的结果。

请访问 Google Cloud 博客,及时了解有关计算高性能计算的最新资讯!

更多 Compute Engine 功能

Compute Engine 具有丰富的功能。您可能需要深入了解以下内容:

向我们提供反馈

  • 请抽出片刻时间,完成这份非常简短的调查问卷