官方给的实验指导: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 类的操作系统有好用的命令行,它可以做到很多图形用户界面不能做的事情。
菜鸟教程有 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就可以显示目录下所有东西的详细信息。
- 加上 -l 选项(意思是 long)变成
vim 文件的相对/绝对路径用 vim 打开文件。你得先用 apt-get 安装了 vim。非常推荐下载 vim,它在 Linux 中是一个非常好用的文本编辑工具。touch 文件的相对/绝对路径其实它是用来修改文件或者目录的时间属性的。但是如果路径所指的文件不存在,系统会建立一个新的文件,所以我是用它来新建文件的。cp 路径1 路径2用来把路径1指向的文件/目录复制到路径2去。mv 路径1 路径2用来把路径1指向的文件/目录移动到路径2去。可以巧妙地用它来给文件重命名,mv 文件名1 文件名2 即可。clear用来清空终端中的文字。

还有一些快捷键:↑ 可以回到上一条往终端中输入的命令,↓ 可以抵消 ↑ 的效果,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](/uploads/projects/linguisty@zju_courses/e2a9453431e1931df147d1061c405dc4.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 就是告诉电脑去哪里找库文件的。
如图是我在虚拟机中的设置,Ubuntu 中环境变量的设置可以完全照搬以上教程。而 Debian 操作系统和 Ubuntu 又不太一样,不能照搬,当时我尝试用 Debian 设置环境变量的时候在整个虚拟机的文件系统里找看起来像 OpenMPI 二进制文件目录和看起来像 OpenMPI 库文件目录的目录找了很久,尝试了很多次,才最终理解“环境变量”的含义并且成功让 hello_c 跑起来。注意,设置 PATH 变量的时候~~:$PATH~~一定要写在新增的路径后面,我也不知道为什么但实践出来就是这样。有没有懂的老哥教教我这是为什么🤔 应该是意外,其他同学实践表明一般情况下写前面还是后面都没关系,不知道为什么我当时只能写后面。
2. HPL
参考这篇博客:https://blog.csdn.net/zqm_0015/article/details/101942937
打开下载界面之后,需要干什么事情,需要输入什么命令,在这里其实都写了,但很多包括我在内的同学习惯性地跳过英文指导,自己摸索,浪费了很多时间。
首先,HPL 一定要装到 /root 目录下。这应该是因为编译 HPL 的 Makefile 文件中写的路径就是 /root。
接下来又是配环境这一人间第一苦差事。学校给的实验指导里面,那些环境变量的设置写得和我们自己电脑上的不一定一样,这时候就要仔细看注释,自己理解问题、解决问题了。
用 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 放宽对代码严谨性的要求。

三、建立集群
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 选项就能强行让电脑允许你用根用户的身份跑程序。

All tests completed and passed residual checks. End of Tests. 收工!
感谢老师、助教和队友们几天以来的指导😘
