3月14日也被称为 Pi Day。为了纪念这个日子,程序员们可以用计算机来计算一下这个无理数。但是想算到 Pi 的第 5000 亿位就不是我们个人的笔记本能够轻易完成的了。下面我们将利用 Google 云平台创建一个 32 核 208GB 内存 8 个 local SSD 的 Linux 实例完成这项工作。
Google Compute Engine 已经支持 1 个虚拟机上有 8 个 375 GB local SSD 存储 ,这样我们就有了 3 TB 的 Local SSD 作为交换空间(swap space)!
在这个单实例 Google Compute Engine 只要花 44.9 小时就可以完成 5000 亿位 Pi 的计算。
假设你已经有了 Google 云平台账号并安装了 gcloud 命令(gcloud 命令是与 Google 云平台交互的命令行工具,例如创建磁盘、虚拟机等)。下面请打开你的 terminal ,然后开始一步步执行。
1. 首先,设置一些变量在后面的命令中使用。
Shell
export PROJECT=”YOUR_GCP_PROJECT" export ZONE="us-central1-c" export CORES="32" export OUTPUT_DISK_SIZE="500GB" export OUTPUT_DISK="out-${CORES}" export INSTANCE="yc-${CORES}"
exportPROJECT=”YOUR_GCP_PROJECT" exportZONE="us-central1-c" exportCORES="32" exportOUTPUT_DISK_SIZE="500GB" exportOUTPUT_DISK="out-${CORES}" exportINSTANCE="yc-${CORES}"
这里主要需要你设置一下你的 Google Cloud 项目 ID 和想要使用的 Zone 。
2. 接下来创建一个磁盘用于保存计算结果(5000亿数字需要占用500GB)
Shell
gcloud compute disks create ${OUTPUT_DISK} / --project ${PROJECT} / --zone ${ZONE} / --size ${OUTPUT_DISK_SIZE} / --type pd-ssd
gcloud compute disks create ${OUTPUT_DISK} / --project ${PROJECT} / --zone ${ZONE} / --size ${OUTPUT_DISK_SIZE} / --type pd-ssd
3. 创建一个附带 8个 local SSD 存储的 compute engine 实例
Shell
gcloud compute instances create ${INSTANCE} / --project ${PROJECT} / --zone ${ZONE} / --machine-type n1-highmem-${CORES} / --maintenance-policy TERMINATE / --image-project gce-nvme / --image nvme-backports-debian-7-wheezy-v20151104 / --local-ssd interface=NVME / --local-ssd interface=NVME / --local-ssd interface=NVME / --local-ssd interface=NVME / --local-ssd interface=NVME / --local-ssd interface=NVME / --local-ssd interface=NVME / --local-ssd interface=NVME / --disk name=${OUTPUT_DISK},device-name=${OUTPUT_DISK}
gcloud compute instances create ${INSTANCE} / --project ${PROJECT} / --zone ${ZONE} / --machine-type n1-highmem-${CORES} / --maintenance-policyTERMINATE / --image-projectgce-nvme / --imagenvme-backports-debian-7-wheezy-v20151104 / --local-ssdinterface=NVME / --local-ssdinterface=NVME / --local-ssdinterface=NVME / --local-ssdinterface=NVME / --local-ssdinterface=NVME / --local-ssdinterface=NVME / --local-ssdinterface=NVME / --local-ssdinterface=NVME / --diskname=${OUTPUT_DISK},device-name=${OUTPUT_DISK}
注意:这一步你会遇到错误,说 32 个 CPU 超过了最大限制。目前每个 Google 云平台项目的每个 Zone 可以使用的默认最大 CPU 总数是 24 个,你可以调整第一步的参数,创建一个 CPU 核数少一点的实例,也可以在 Google Cloud 控制台下,Compute Engine – Quotas 下面申请调大这个限制。一般而言很快获得客服的批准,然后就可以创建 32 核的实例了。
4. 通过 SSH 登录上一步创建的 Linux 实例。
Shell
gcloud compute ssh ${INSTANCE} -zone ${ZONE}
gcloud compute ssh ${INSTANCE} -zone ${ZONE}
5. 这一步我们要格式化并挂载 8 个 local SSD 和第二步创建的磁盘。
Shell
$ sudo su - $ for i in `seq 0 7`; do / mkdir /mnt/${i}; / /usr/share/google/safe_format_and_mount / /dev/disk/by-id/google-local-ssd-${i} /mnt/${i}; / done $ mkdir /mnt/out $ /usr/share/google/safe_format_and_mount / /dev/disk/by-id/google-${OUTPUT_DISK} / /mnt/out
$ sudosu - $ for i in `seq 0 7`; do / mkdir /mnt/${i}; / /usr/share/google/safe_format_and_mount / /dev/disk/by-id/google-local-ssd-${i} /mnt/${i}; / done $ mkdir /mnt/out $ /usr/share/google/safe_format_and_mount / /dev/disk/by-id/google-${OUTPUT_DISK} / /mnt/out
6. 搭好机器后,就是计算本身了。
请下载 最新版 y-cruncher 程序 。解压之后进入目录,找到可执行文件 y-cruncher 。然后执行下面的命令就可以开始最终的计算了。
Shell
$ export DIGITS=”500000000000" $ ./y-cruncher custom pi -dec:${DIGITS} -hex:0 / -o /mnt/out -mode:swap -swap:raid0 / /mnt/0 /mnt/1 /mnt/2 /mnt/3 /mnt/4 /mnt/5 /mnt/6 /mnt/7
$ exportDIGITS=”500000000000" $ ./y-crunchercustompi -dec:${DIGITS} -hex:0 / -o /mnt/out -mode:swap -swap:raid0 / /mnt/0 /mnt/1 /mnt/2 /mnt/3 /mnt/4 /mnt/5 /mnt/6 /mnt/7
下面的运行过程的截图,请耐心等待技术结果:)
云计算的好处就是按需使用和付费,CPU、内存、磁盘都可以按需配置,对学生、科研人员和企业都非常方便、经济。
除了 gcloud 命令行,你还可以在 Google 云平台的 Web 控制台管理和监控资源的使用:
英文原文: Calculating and searching 500 billion digits of Pi .
Post Views: 7
除非特别声明,此文章内容采用 知识共享署名 3.0 许可,代码示例采用 Apache 2.0 许可。更多细节请查看我们的 服务条款 。