自己动手搭建小型超算中心,实现小规模并行计算

本文简要介绍如何构建一台微型“超算”。不过真正的超算要复杂很多,因为涉及到多用户,多任务,队列管理和存储管理等等一系列问题,还涉及到电源,冷却以及网络连接等等。本文介绍的搭建方案,在没有排到大型机的情况下,还是可以应付一些简单的小规模的并列运算。

超算没有那么神秘,大部分程序还是 Fortran 和 c 的,运行方式也是手动编译,然后提交队列。可以算是电子时代的暴力美学吧。

1 理论

1.1 并行计算

并行计算(parallel computing)是指在并行机上,把一个应用分解成多个子任务,分配给不同的处理器,各个处理器之间协同,并行执行子任务,目的是加快计算速度。
由此需要:

硬件支持,需要并行机,多核,单机的话,单个任务在一个核心上执行和多核上执行速度也不一样,多机就需要网络连接。

计算的问题可以并行,如果计算的问题是流水线,互相关联度很高,完全没法并行,那么就没有必要用并行计算或者超算。

需要进行相应的编程优化。

那么什么样的问题需要超算呢,大规模的科学和工程计算,比如天气预报,需要 24 小时完成 48 小时的数值模拟,至少需要 635 万个网格点,内存大于 1TB,计算性能要求高达 25 万亿次 /s。

1.2 MPI 消息传递接口

MPI(message Passing interface)是全世界联合建立的消息传递编程标准,目的是用消息传递提供一个高效可扩展,统一的编程环境,是目前最为通用的并行编程方式,也是主要应用的。MPI 有多种 "实现",包括 mpich1/mpich2、openmpi、lam-MPI 等,每种 MPI 的实现需要配合相应的编译器,才能发挥作用。c 语言 MPI hello world:

#include 
#include 

int
main(int argc, char *argv[])
{
    int rank, size;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    printf("Hello, World.  I am %d of %d\n", rank, size);
    MPI_Finalize();
    return 0;
}

1.3 并行算法

任何并行算法的设计都是基于某一特定的并行计算模型,而并行计算模型是从各种具体的并行机中抽象出来的,它能在一定程度上反映出具体并行机的属性,又可使算法研究不再局限于某一种具体的并行机。并行算法可从不同的角度分类成数值计算的和非数值计算的并行算法;同步的、异步的和分布式的并行算法;共享存储的和分布存储的并行算法;确定的和随机的并行算法等等。举个例子,单个进程的快速排序:

输入 : 无序序列(Aq,⋯,Ar) 输出 : 有序序列(Aq,⋯,Ar)

Procedure QUICKSORT(A,q,r)
Begin               
     if q

然后进行并行化之后是这个样子,基于二叉树的并行选主元的 PRAM_CRCW 模型上的快排序算法。执行快排序可以看成是构造一棵二叉树,其中主元是根,小于等于主元的元素处于左子树,大于主元的元素处于右子树。算法首先从选第一个主元开始,它划分原序列为两个子序列;然后相继子序列中主元的选取则可并行执行。当这样的二叉树造好后,采用中序遍历的方法就可得到一个有序序列。

输入:序列 (A1,⋯,An) 和 n 个处理器 输出:供快排序用的一棵二叉树

Begin
    (1)for each procesor i do           
        (1.1)root=i
        (1.2) fi =root
        (1.3) LCi = RCi = n + 1                 
    endfor
    (2)repeat for each procesor i≠root do 
    if (AI < Afi) ∨ (AI = Afi ∧ i < fi) then        
        (2.1)LCfi =i                
        (2.2)if i = LCfi then exit else fi = LCfi endif         
        else
        (2.3)RCfi =i        
        (2.4)if i=RCfi then exit else fi = RCfi endif
        endif
     end repeat                 
End

2 超级计算机的结构

节点(node)。每个节点由多个处理器构成,可以直接输入输出(I/O)。一般来说登陆节点和计算节点应该分开的。
互联网络(interconnect network)。连接节点。
存储(memory)。由多个存储模块构成

2.1 节点

需要 cpu,有缓存,有内存,还需要网络连接,专用的工业超算还需要专门设计节点,比如 cray 节点。

*from Performance Computer, XC Series Supercomputers

2.2 网络拓扑

有了节点,就需要对节点进行连接,评价一个网络的准则应该是,对于一定数量的节点,点对点的带宽越高,折半宽度越大,或者网络直径越小,点对点延迟越小,质量就越好。拓扑结构可以分为静态,动态,和宽带连接三类。

静态连接,就是对于固定数量的节点,单独设计的一套固定的物理连接,至于用什么线连接,都是对用户不可见的,具体取决于厂商或者设计者。连接的拓扑包括阵列(array),环(ring),网格(mesh),网格环(torus),树(tree),超立方体(hypercube),蝶网(butterfly),Benes 网等等。详情可以参考其他文献,《面向拓扑结构的并行算法设计与分析》李晓梅等。现在比较有名的超算一般采用超立方体(hypercube)四维立方体,长这样:

attachments-2020-02-6KxVQHKg5e4fa1838ddc8.jpg

动态连接,静态虽好,但是扩展比较困难,如果采用比较简单一维阵列,一个节点挂了,整台都挂了,而且不适合异构的混合计算。那么动态的连接方式就出现了。主要有多层总线连接,或者交叉开关。

宽带连接(常见),这是我们能够用得起的,因为以上的连接方式有的需要专用设备,有的需要根据节点进行设计,而且随着以太网和交换机的发展,网络连接的速度可以满足通信需求,大部分的集群都采用宽带互联网。

2.3 存储

随着 cpu 的发展,目前的瓶颈在于存储,所谓的内存墙(memory wall)解决方法就是增加缓存,增加缓存层级或者扩大缓存容量,在其中找到一个价格也能接受,速度也够用的平衡。

attachments-2020-02-nrb8MX4e5e4fa19d7fcf1.jpg

而对于不同的需求和设计,也会有不同的存储管理机制,如果是大规模并行系统(MPP),数据超大,就需要单独的存储管理,对于小型集群,存储的设计可以单独设计 NFS 也可以直接利用节点存储。

2.4 超级计算机的分类

集群(cluster),利用商用节点,商用 cpu 或者 GPU,采用商用交换机连接,操作系统采用 Linux,GNU 编译器,和 PBS。

星群(constellation),系统的每个节点是一个并行机子系统,每个子系统里包含好多个处理器,采用商用交换机连接,操作系统和编译系统和 PBS 可以采用专用的。

大规模并行系统(MPP,Massively Parallel Processing),每个节点包含 10 个左右的处理器,共享存储,处理器可以用专用的,或者商用的,采用高性能网络连接,节点分布存储。操作系统和编译系统和 PBS 需要专用的。

具体的超算信息可以查看 top500 TOP500 Lists | TOP500 Supercomputer Sites

3 操作系统和软件环境

3.1 操作系统

都是 UNIX 和类 UNIX,比如 Linux,操作都差不多,学好 Linux 还是很重要滴。Windows 也可以,但是目前已经不是主流。

需要的语言,不分顺序,Fortran 77/90/95、c/c++、shell、Python、perl、等等等等。因为在科学计算领域,软件更新比较慢,所以祖传老代码比较多,所以,使用标准一般比较老,且不保证兼容,所以想一次编译通过,不是很容易(头疼)。

根据架构的不同,编译器一般会有选择,比如开源的 GCC,Intel 全家桶,ARM 编译器,超算制造商的特殊编译器,IBM 编译器,Cray 的编译器,Fujitsu 的编译器等等,开源的一般来说效率没有收费的高。

3.2 进程,进程通信

进程(process)是基本的单位,包括,程序代码、控制状态、数据、执行状态,进程拥有独立的运行环境,高内聚低耦合嘛。在多核运算中,多个进程跑在一个物理核心上是不能缩短总运行时间的(walltime),反而会小幅增加,所以,说核心的时候,尽量以物理核心为准。

进程内的单位就是 thread,如果利用 openmp 进行节点内并行的话,就需要创建 thread。

进程间的通信 有三种形式,通信、同步、和聚集,主要形式就是通信,通过消息(message)传递,进行通信,实现的形式可以是通过共享存储或者网络通信,但是这对用户都是不可见的,我们只需要调用 MPI。

4 两台 PC 的“集群”

4.1 硬件

两台节点:Intel i7 4 核,6g 内存,1T 硬盘,独立显卡(GPU 太弱,不用它来计算,只用于连接显示器)Intel Gigabit 以太网卡。

网络连接:gigabit 以太网 switch HUB(L2 交换机),网线,需要路由器连接互联网

4.2 安装操作系统

安装 Ubuntu,具体的安装步骤就很简单,略。但是要注意的是尽量采用同样的用户名和密码,并将计算机名称编号,最后记得把用户设成管理员。

4.3 配置环境,安装软件

sudo apt -y update
sudo apt -y upgrade

首先,更新一下 apt。

sudo apt -y install emacs openssh-server openssh-client nfs-common libgomp1 openmpi-bin libopenmpi-dev openmpi-common update-manager-core

然后安装这些软件……

这些都是啥呢,我慢慢讲:

emacs:编辑器(比较适合新手,老手可以直接使用 vi)

openssh-server openssh-client: openssh 的服务和客户端

nfs-common: 网络文件系统

libgomp1 :openmp 是一套支持跨平台共享内存方式的多线程并发的编程 API

openmpi-bin libopenmpi-dev openmpi-common: openmpi,开源的 MPI

update-manager-core: 更新用

sudo apt -y dist-upgrade

然后更新一下软件的依赖,防止出现依赖的遗漏。

4.4 网络配置

网络连接,使用交换机集线器连接,连接方式多种多样,由于我们的组装的规模很小,所以,低于交换机的接口数的时候就把交换机作为行星网络的中心,如果需要多个交换机,就采用层状交换机结构。出于简单考虑,IP 没有设成静态,直接采用路由器的 hdcp 功能,动态分配 IP,如果要长期使用,请设置成静态 IP。那么自动分配的 IP 分别是 XXX.65.121.82 和 XXX.65.121.102, 分别对应的名称是 server01 和 server02。更改静态 IP 需要更改 /etc/network/interface 文件(Ubuntu18 的这部分设置被更新了,需要采取其他方法)。

查询 IP 地址,可以直接去 gui 的界面去看,也可以输入命令,新的操作系统已经不默认安装 ifconfig 了,可以试试。

更改 /etc/hosts 文件,把 IP 和名字对应上,这样操作起来比较方便,不用处处都输入 IP。如果查看自己的 hostname,可以查看 /etc/hostname 文件。

  • 分享于 · 2020.02.21 16:53 · 阅读 · 7291

[版权声明] :本文系网友分享,仅以非商业性的交流和科研为目的,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本网( friends@stuch.cn )联系!我们将协调给予处理。转载授权码:确权中,请原作者尽快与我们取得联系,阅读原文(请登录)..

0 条评论

请先 登录 后评论
猜猜我是谁
Hollow -研究生

13
提问
38
回答
12
文章