在 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

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

该命令将显示当前 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++ 程序来计算圆周率。即使您之前没有使用 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

最后一行是 pi 的前 100 位小数。恭喜,您刚刚让计算机为您计算!

该程序可以计算更多位数(目前上限为 1,000 亿位数)。现在,让我们计算 1 千万位数字,并测量需要多长时间。我们将输出重定向到一个文件,因为 1000 万位数的 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。

  • 实际时间:从开始到结束的实际时间,这意味着在上例中,计算 1, 000 万位数的圆周率需要 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 实例,否则它将继续运行并产生费用。

如果您使用的是虚拟机(通过 SSH 连接),请先运行 exit 命令,以退出登录。

exit

然后,运行以下 gcloud compute instances delete 命令以删除该实例及关联的磁盘。系统会提示您确认删除资源。

gcloud compute instances delete pi-codelab

9. 接下来做什么?

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

2022 年,我们使用相同的基础架构来计算 100 万亿位数的圆周率。请阅读公告,了解我们的表现。所有结果均可通过我们的 pi.delivery 演示网站获取。

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

更多 Compute Engine 功能

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

向我们提供反馈