官方给的实验指导:https://www.zjusct.io/HPC101-Labs-2022/Lab1-MiniCluster/

一、预备知识

我们今年(2022年暑假)第一堂课,陈建海老师说上面那份实验指导挺详细的,但是学生普遍反映不够详细,实际上这是因为学生缺少一些必要的知识,不能榨干实验指导里的信息。MIT 要设置一门叫做 Missing Semester 的课,就是考虑到了有很多本科生缺少这些前置知识。当然如果你在看这份文档,那你应该已经被这门课的 lab 火烧眉毛了,咱们尽量在不用细看 Missing Semester 的情况下快速掌握这些知识。加油油!😆

1. 虚拟机

首先,实验指导里说要下载个 Hypervisor 和 Linux 光盘映像文件。Hypervisor 还是用 VMware 比较好,虽然收费,但功能齐全易上手,而且一个月免费试用期够我们上完超算课程了。Linux 光盘映像文件大概就是在硬盘里开辟一块空间作为虚拟的光盘,光盘里面有 Linux 操作系统可以安装,就模拟了用真实的光盘给真实的电脑装操作系统的过程,用虚拟光盘给虚拟机装了操作系统。Ubuntu 是最适合新手入门的 Linux 操作系统,用的人多,资料也多。其中,Ubuntu18 用的人最多。所以尽管官方的实验指导里面说用 Debian,但我还是建议用 Ubuntu。浙大镜像站上只有 Ubuntu20 最接近 Ubuntu18,我就用它了。
内存和磁盘空间如果没给够,那虚拟机的操作系统就没法正常安装,会一直安装失败却没有报错信息,让我困惑了好久。VirtualBox 推荐的给 8G 空间实在有点少了!还是 VMware 聪明。
网络建议按照官方指导使用 NAT Network。有些同学用桥接网络,这样的话浙大校园网会把虚拟机认知为独立的电脑,需要在虚拟机上登录 ZJUWLAN 账号才能联网。而 NAT Network 下,所有虚拟机通过宿主机联网,宿主机等接上 ZJUWLAN 虚拟机就能上网。

2. Linux

Windows 操作系统在市场中占大头,但其实 Linux 更加轻便稳定,而且很多高端场合是用 Linux 操作系统的,计院的学生应该学着用。
Linux 类的操作系统有好用的命令行,它可以做到很多图形用户界面不能做的事情。
C5Q_I6I55UDC~GDH)DJF2FP.png
菜鸟教程有 Linux 常用命令大全:https://www.runoob.com/linux/linux-command-manual.html
一些常用的基础命令有:

  • cd 相对/绝对路径 是 Change Directory 的缩写,用来进入相对/绝对路径指向的目录(相当于 Windows 中的文件夹)。注意,它是用来进入目录的,不能进入文件。
    • .. 表示包含了当前目录的那个目录,称为上级目录。. 表示当前目录。- 表示你上一个去过的目录。~表示 /home 下当前用户的目录。
    • cd .. 可以去当前目录的上级目录。
    • cd ../../.. 递归几次,可以去上级目录的上级目录的……
    • cd - 回到上一个去过的目录。
  • su 是 Super User 的缩写。接下来它会让你输入密码,你输入密码的时候命令行是不会显示你输入了什么的,连提示输入了几个字符的星号都不会有,但不要以为你输入不了密码,你确实成功输入了。输对了密码就会进入根用户。Linux 是一个多用户多任务操作系统,你登录了根用户,就是获得了比普通用户更大的权限,可以在这台电脑上修改一些敏感的信息。
  • exit 退出根用户身份,或者退出远程登录的其他计算机。
  • sudo 命令 在你没有以根用户身份登录的情况下,临时以根用户的身份执行一条指令。养成用 sudo 而不用 su 的习惯,可以有效防止以根用户身份误改敏感信息,导致必须重装系统。
  • apt-get install 软件名 用来从软件源中下载你要的软件,比如 apt-get install python 就能下载到 python 解释器。但是如果你的软件源中没有你要的软件,就无法下载了,这时候需要换源,可以上 CSDN 找教程。
  • wget 网址 用来从某个网址下载你要的软件。
  • ls 列出你所在的目录下有什么东西。
    • 加上 -l 选项(意思是 long)变成 ls -l 就可以显示目录下所有东西的详细信息。
  • vim 文件的相对/绝对路径 用 vim 打开文件。你得先用 apt-get 安装了 vim。非常推荐下载 vim,它在 Linux 中是一个非常好用的文本编辑工具。
  • touch 文件的相对/绝对路径 其实它是用来修改文件或者目录的时间属性的。但是如果路径所指的文件不存在,系统会建立一个新的文件,所以我是用它来新建文件的。
  • cp 路径1 路径2 用来把路径1指向的文件/目录复制到路径2去。
  • mv 路径1 路径2 用来把路径1指向的文件/目录移动到路径2去。可以巧妙地用它来给文件重命名,mv 文件名1 文件名2 即可。
  • clear 用来清空终端中的文字。

image.png
还有一些快捷键:↑ 可以回到上一条往终端中输入的命令,↓ 可以抵消 ↑ 的效果,Ctrl+Shift+C 复制,Ctrl+Shift+V 粘贴。

3. 计算机网络

IP 是网际协议的缩写。人们要通过计算机网络来交换数据,就需要有一套协议,商量好数据该怎么编码,怎么发送。IP 规定了数据包的封装结构和寻址方法,给世界上每一台联网的设备分配了一个独一无二的 IP 地址,这样就可以通过 IP 地址和所有人都知道的编码解码方案来传递数据。一开始,IP 的架构是 IPv4,IP 地址形如 192.168.xxx.xxx。但后来能联网的设备越来越多,IP 地址不够用了,就有了 IPv6。
ifconfig是 Linux 系统中用来显示网络配置的命令,同样可以加 -l 显示更详细的信息。
ping 是一种计算机网络工具,用来测试数据包能否通过 IP 协议到达特定主机。ping的运作原理是向目标主机传出一个请求回显数据包,并等待接收回显回应数据包。程序会按时间和成功响应的次数计算丢包率和数据包往返时间(网络时延,Round-trip delay time)。如果实验要用的虚拟机之间 ping 不通(表现为丢包率 100%),说明它们没接到同一个网络中,网络设置有问题。在终端输入ping IP地址即可往 IP 地址指向的那台设备发送数据包,Windows 默认发送 4 个之后开始算丢包率,而Linux 是默认一直发送的,可以用 ping IP地址 -c n来控制发送 n 个数据包后停止发送,开始统计丢包率。
ssh 用来建立安全远程连接,可以安全地远程登录其他电脑,只要目标电脑接受访问而且已经开机了。它到底怎么加密怎么安全不用管它,会用这个工具就好了。

4. Vim

一个在 Linux 中很好用的文本编辑编辑软件。请看菜鸟教程:https://www.runoob.com/linux/linux-vim.html。快捷键记不住没关系,知道一般模式、编辑模式的基本操作就行。

5. 查资料的渠道

在查资料和问人之前,仔细看看要装的东西有没有 README 文件,或者代码里有没有注释。
CSDN 和百度固然好用,但很多时候 google、github 才能快速帮你找到你需要的技术指导,而这两个工具需要科学上网,如果不会科学上网或者失去了可用的梯子,请看 CC98 的这个帖子:https://www.cc98.org/topic/4915418

6. 沟通技巧

老师、助教和学长们都有很多自己的事情要忙,我们提问题应该高效。请参考下述指南,很快就能读完:https://github.com/tvvocold/How-To-Ask-Questions-The-Smart-Way

二、安装软件

1. OpenMPI

L9]CKGYYSDDUGTMV1}0CGD8.png
这个 .tar.gz 结尾的就是我们需要的压缩文件,看看它的链接。在虚拟机的终端中输入wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.4.tar.gz即可下载到压缩包,之后的操作请参考:https://blog.csdn.net/qq_26822029/article/details/107930758
这里非常容易出错的是 PATH 和 LD_LIBRARY_PATH 两个环境变量的设置。环境变量,就是告诉电脑去哪里找文件用的变量。我们在终端中输入的各种命令其实都是储存在计算机里的程序,执行命令就是调用程序,而 PATH 环境变量就是用来告诉电脑去哪里找这些程序的。library 在这里是“库”的意思,所以 LD_LIBRARY_PATH 就是告诉电脑去哪里找库文件的。
image.png
如图是我在虚拟机中的设置,Ubuntu 中环境变量的设置可以完全照搬以上教程。而 Debian 操作系统和 Ubuntu 又不太一样,不能照搬,当时我尝试用 Debian 设置环境变量的时候在整个虚拟机的文件系统里找看起来像 OpenMPI 二进制文件目录和看起来像 OpenMPI 库文件目录的目录找了很久,尝试了很多次,才最终理解“环境变量”的含义并且成功让 hello_c 跑起来。
注意,设置 PATH 变量的时候~~:$PATH~~一定要写在新增的路径后面,我也不知道为什么但实践出来就是这样。有没有懂的老哥教教我这是为什么🤔 应该是意外,其他同学实践表明一般情况下写前面还是后面都没关系,不知道为什么我当时只能写后面。

2. HPL

参考这篇博客:https://blog.csdn.net/zqm_0015/article/details/101942937
8G1($ZQBIERHS9LED1A%3VF.png打开下载界面之后,需要干什么事情,需要输入什么命令,在这里其实都写了,但很多包括我在内的同学习惯性地跳过英文指导,自己摸索,浪费了很多时间。
首先,HPL 一定要装到 /root 目录下。这应该是因为编译 HPL 的 Makefile 文件中写的路径就是 /root。
接下来又是配环境这一人间第一苦差事。学校给的实验指导里面,那些环境变量的设置写得和我们自己电脑上的不一定一样,这时候就要仔细看注释,自己理解问题、解决问题了。
image.png
用 vim 打开 Make.test 文件,注释里说,MPinc 是用来指示 C 编译器去哪里找 MP 库头文件的。我真不知道这个所谓的“MP 库头文件”是什么东西,就在文件系统里全局搜索(可以在图形用户界面里搜索,也可以在终端用find 文件名/目录名命令去找)名字带 include 或者 openmpi 的目录,一个个翻过来,最后觉得 /usr/local/include/openmpi 这个目录最像,就把路径设成它了。前面的-I意思是这个路径指向目录而不是文件。同理,我全局搜索找到了 MPI 的库文件 libmpi.so。然后看注释里说 MPdir 是用来构成另外两个环境变量的,而我另外两个环境变量都已经用绝对路径写出来了,就没必要用 MPdir 了,所以我加个#把它注释了。
LAlib 环境变量指示的是线性代数库文件的路径。cblasLINUX.a 和 blas_LINUX.a 这两个库文件又是我全局搜索才找到的。注意别漏了 CBLAS 的库文件。
最后要找 mpicc,知道要找的东西的文件名,就可以在终端中输入which mpicc快速找到它的地址。
在终端输入make arch=test编译 HPL,我这边出现了 undefined reference to _gfortran_xxx 的报错,往 Make.test 中 HPL_LIBS 变量后面加 -lgfortran编译选项解决了。据说是因为高版本的 gfortran 编译器对代码的严谨性要求更高了,HPL 库文件中有些老派写法的代码不能通过编译,加这个编译选项就能让 gfortran 放宽对代码严谨性的要求。
![5E3Y`~YPV(_7Q%E(
%E{4SF.png](https://cdn.nlark.com/yuque/0/2022/png/25775350/1656657172672-eb9f5c99-ae8b-41cb-b833-c98066ef61b3.png#clientId=u37201257-6cac-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=50&id=u136f9cbe&margin=%5Bobject%20Object%5D&name=5E3Y%60~YPV%28_7Q%25E%28_%25E%7B4SF.png&originHeight=89&originWidth=1070&originalType=binary&ratio=1&rotation=0&showTitle=false&size=63046&status=done&style=shadow&taskId=ue24791f1-c183-42d7-90df-ef6d6c564c5&title=&width=600)

三、建立集群

1. 克隆节点

我一开始克隆出来的节点的 IP 地址都是一样的。应该是因为我最开始创建虚拟机的时候设置错了,没有让它动态分配(DHCP)IP 地址。后来我换用 VMware 从头开始实验就没遇到这个问题,我的队友们也没遇到过这个问题,就……不深究了吧!

2. 配置 ssh

参考这篇文章:https://blog.csdn.net/weixin_47068172/article/details/113730027
为了方便,我关了所有虚拟机的防火墙。反正这些虚拟机上也没什么关于我的信息,被攻击了就被攻击了吧,不会对我造成什么损失。
奇怪的是,我不管怎么设置都不能用普通用户免密登录其他虚拟机,但用根用户是可以免密登录的。交流群里有其他同学也遇到了这个问题,但好像最后没得到明确的答案,所以我就用根用户跑并行程序了。

3. mpirun

hostfile 文件是要自己创建自己编写的,可以随便放在什么地方,文件名也是任意的,只要之后测试的时候把它的路径写对就行了。
xhpl 文件是 HPL 自带的,很可能在 hpl-2.3/bin 目录下,实在找不到还是全局搜索吧。xhpl 所在的目录下还有一个 HPL.dat 文件,是运行 HPL 必须的,所以要先进入这个目录再运行 mpirun,否则会报错说找不到 HPL.dat。
在终端尝试用根用户来跑程序,会提示不建议用根用户跑程序,因为根用户权限比较大,用根用户跑程序可能会导致你毫无阻拦地跑了一个病毒,把这台电脑毁了。这时候加上 —allow-run-as-root 选项就能强行让电脑允许你用根用户的身份跑程序。
![KMMYVI4V2DH33SW[G2FEF.png](https://cdn.nlark.com/yuque/0/2022/png/25775350/1656659537084-4a218356-a04a-4839-8d67-12c18c96ecb6.png#clientId=u37201257-6cac-4&crop=0&crop=0&crop=1&crop=0.4469&from=paste&height=400&id=u3d6e3ad1&margin=%5Bobject%20Object%5D&name=KMMYVI4V2DH33SW%60%5B%60G2FEF.png&originHeight=715&originWidth=1250&originalType=binary&ratio=1&rotation=0&showTitle=false&size=408879&status=done&style=shadow&taskId=ud8692269-f2bd-4e22-a0f4-43bc712ecf7&title=&width=700)
}4XTZY(KQ9AR@Q%(D6%OY56.png
All tests completed and passed residual checks. End of Tests. 收工!
感谢老师、助教和队友们几天以来的指导😘