使用Intel的mkl软件计算CPU的浮点数计算性能

Intel的mkl软件能使用linpack计算CPU浮点数性能。

wget https://software.intel.com/content/dam/develop/external/us/en/documents/l_mklb_p_2021.1.1.001.tgz
tar zxf l_mklb_p_2021.1.1.001.tgz
cd l_mklb_p_2021.1.1.001/benchmarks_2021.1.1/linux/mkl/benchmarks/linpack
./runme_xeon64

以上操作,程序会其实是调用了linpack-xtreme计算FLOPS。对一些服务器的FLOPS测试结果如下:

服务器型号         CPU型号数量        整体FLOPS           系统
惠普DL580G9       E7-8890 V3 * 4    1084.3483 GFlops    CentOS7
华为RH5885H V3    E7-4890 V2 * 4    838.5290 GFlops     CentOS7
华为RH5885H V3    E7-4890 V2 * 4    514.2317 GFlops     CentOS7
华为RH5885H V3    E7-4890 V2 * 4    281.1997 GFlops     CentOS8
戴尔R910          E7-8870 * 4       304.9025 GFlops     CentOS8
惠普DL980G7       E7-4870 * 8       586.0235 GFlops     CentOS8
戴尔T620          E5-2620 * 2       190.9405 GFlops     CentOS7

使用HPL软件测试服务器浮点数计算性能

HPL(High-Performance Linpack)软件使用Linpack算法来测试计算机双精度浮点数计算性能。

安装HPL软件

# 安装mpich
wget http://www.mpich.org/static/downloads/3.3/mpich-3.3.tar.gz -P ~/software/
tar zxf ~/software/mpich-3.3.tar.gz
cd mpich-3.3
./configure --prefix=/opt/sysoft/mpich-3.3 && make -j 4 && make install
cd .. && rm -rf mpich-3.3
echo 'export PKG_CONFIG_PATH=/opt/sysoft/mpich-3.3/lib/pkgconfig:$PKG_CONFIG_PATH' > ~/.bashrc.mpich
echo 'export LD_LIBRARY_PATH=/opt/sysoft/mpich-3.3/lib:$LD_LIBRARY_PATH' >> ~/.bashrc.mpich
echo 'export C_INCLUDE_PATH=/opt/sysoft/mpich-3.3/include:$C_INCLUDE_PATH' >> ~/.bashrc.mpich
echo 'export PATH=/opt/sysoft/mpich-3.3/bin/:$PATH' >> ~/.bashrc.mpich
source ~/.bashrc.mpich

# 安装openblas
sudo yum -y install openblas openblas-devel
# 若是CentOS8系统
sudo dnf --enablerepo=PowerTools install gcc-fortran openblas openblas-devel

# 安装hpl
wget http://www.netlib.org/benchmark/hpl/hpl-2.3.tar.gz
tar zxf hpl-2.3.tar.gz
cd hpl-2.3/
source ~/.bashrc.mpich
./configure --prefix=/opt/sysoft/hpl-2.3
make -j 8
make install
cd ../ && rm -rf hpl-2.3

在当前目录下生成HPL的配置文件HPL.dat,该配置文件适合72核心的单节点服务器。

HPLinpack benchmark input file
Innovative Computing Laboratory, University of Tennessee
HPL.out      output file name (if any)
6            device out (6=stdout,7=stderr,file)
1            # of problems sizes (N)
82944        Ns
1            # of NBs
144          NBs
0            PMAP process mapping (0=Row-,1=Column-major)
1            # of process grids (P x Q)
8            Ps
9            Qs
16.0         threshold
2            # of panel fact
2 1 0        PFACTs (0=left, 1=Crout, 2=Right)
1            # of recursive stopping criterium
2 4          NBMINs (>= 1)
1            # of panels in recursion
2            NDIVs
1            # of recursive panel fact.
1 0 2        RFACTs (0=left, 1=Crout, 2=Right)
1            # of broadcast
0            BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM)
1            # of lookahead depth
0            DEPTHs (>=0)
2            SWAP (0=bin-exch,1=long,2=mix)
64           swapping threshold
0            L1 in (0=transposed,1=no-transposed) form
0            U  in (0=transposed,1=no-transposed) form
1            Equilibration (0=no,1=yes)
8            memory alignment in double (> 0)

配置文件中的重要参数如下:

1        # of problems sizes (N)
    设置程序运行时使用的 N 值的个数。
82944    Ns
    设置程序运行时使用的 N 值。上一个参数的值有多大,此处则输入对应个数的 N 值。N 值为Linpack进行浮点运算的问题规模。求解问题规模为N时,Linpack浮点运算次数 = 2 / 3 * N^3 - 2 * N^2。再测得系统计算所消耗的时间T,即可算出浮点运算每秒次数FLOPS值。需注意内存和计算时间消耗随该值增大呈指数级增加,内存消耗=N*N*8。比如该参数值为20000时消耗3.2GB内存,设置为30000时消耗约7.2GB内存。在HPL软件进行计算时,该值设置越大,有效计算所占的比例也越大,其结果FLOPS值越大。此外,该值推荐设置为 P * Q * NB 的整数倍。
1        # of NBs
    设置程序运行时使用的 NB 值的个数。
144      NBs
    设置数据分块数量,有利于并行化计算。上一个参数的值有多大,此处则输入对应个数的 NB 值。推荐设置为 P * Q 的整数倍。要计算的问题规模比较大,将这些计算均匀分配给各个CPU核心。
1        # of process grids (P x Q)
    设置程序运行时使用的 P x Q 的个数。
8        Ps
9        Qs
    设置并行化和多线程的CPU使用个数。尽可能让P和Q相等,并使两者的乘积为服务器的CPU总核心数,使P <= Q,也最好使P值为2的n次方。上一个参数设置有多大,则此处输入对应个数的P和Q值。
2       # of panel fact
2 1 0 PFACTs (0=left, 1=Crout, 2=Right)
    设置panel fact的值个数。上面设置了使用2种panel fact参数,下一个参数虽然有3个值,于是HPL运行时选取使用前两个值。
    后面还有几个这样的参数设置。但是对结果影响不大。只有前面的N, NB, P 和 Q 对结果影响较大。特别是 N 值影响最大。

运行HPL程序进行FLOPS计算

/opt/sysoft/mpich-3.3/bin/mpirun -np 72 /opt/sysoft/hpl-2.3/bin/xhpl

    程序运行需要当前目录下存在HPL.date配置文件。

程序运行的注意事项:

(1)mpirun的-np参数值是服务器的CPU总核心数。对应着参数文件种 P * Q 的值。要求 -np 参数的值 >= P * Q,否则程序报错。
(2)HPL若使用超线程后总CPU线程数来进行计算,其FLOPS值更低,比用总核心数低约20%。
(3)若可以的话,设置不同的参数来让HPL程序运行多次,取其最高值(峰值)作为服务的FLOPS计算性能。
(4)配置以 # 开始的参数用于设置多个值,程序有7个参数可以设置不同的多个值,于是排列组合后可以运行很多次,选择最大值作为FLOPS计算峰值。
(5)当设置多种参数值,会很消耗计算时间,且其结果都相差不大,则可以考虑节约时间,不用设置太多的参数值。
(6)程序第一个运行种CPU刚唤醒,导致其有效计算所占的比例要小些,其结果会差些,特别是N值设置不够大时更明显,推荐至少有2次运行。
(7)设置稍大的 N 值,让每次Linpack程序运行时间长度超过200秒,则获得的结果更准确些。若运行时间太长,则感觉很费时间。

程序结果如下。按上面的配置文件,设置了2个不同的参数运行。第一次运行的结果一般较低,直接看第二次的结果作为服务器的计算性能:1297 Gflops。

================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR00C2R2       82944   144     8     9             311.44             1.2215e+03
HPL_pdgesv() start time Sat Apr 10 06:32:55 2021

HPL_pdgesv() end time   Sat Apr 10 06:38:06 2021

--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=   1.11497782e-03 ...... PASSED
================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR00C2C2       82944   144     8     9             293.31             1.2970e+03
HPL_pdgesv() start time Sat Apr 10 06:38:15 2021

HPL_pdgesv() end time   Sat Apr 10 06:43:09 2021

--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=   1.07067674e-03 ...... PASSED
================================================================================

使用HPL对一些服务器的FLOPS测试结果如下:

服务器型号        CPU型号数量        整体FLOPS          系统
惠普DL580G9      E7-8890 V3 * 4    1297.0 GFlops      CentOS7
华为RH5885H V3   E7-4890 V2 * 4    904.68 GFlops      CentOS7
华为RH5885H V3   E7-4890 V2 * 4    614.23 GFlops      CentOS8
惠普DL980G7      E7-4870 * 4       339.53 GFlops      CentOS8

使用linpack-xtreme-1.1.5软件测试CPU的浮点数计算性能

对服务器或电脑的计算性能进行时描述,一般使用FLOPS或MIPS为单位进行量化。MIPS表示每秒执行的百万级的机器语言指令数。CPU的主频越高,MIPS线性增加。由于不同时代的CPU主频可能一致,但执行指令的速度差异极大,因此MIPS无法衡量CPU实际的计算性能。FLOPS表示每秒的浮点数运算次数,能准备表述计算机的性能。

Linpack(Liner system package)是目前最流行的用于测试高性能计算机系统浮点性能的方法。它通过高斯消元法求解N元一次稠密线性代数方程组的测试,评价高性能计算机的浮点性能。

使用linpack-xtreme-1.1.5软件可以在Linux或Windows系统下测试CPU的FLOPS。在Linux系统中,解压缩linpack-xtreme-1.1.5软件后,使用其中的AuthenticAMD命令即可测试服务器的FLOPS。

直接运行AuthenticAMD,会使用全部的线程进行计算,其测试的结果会偏小。推荐使用1个线程运行单个AuthenticAMD命令,并行化运行与CPU核心数相同个数的AuthenticAMD命令,从而获得服务器整体的FLOPS性能。

于是编写程序test_FLOPS_by_linpack-xtreme.pl来并行化调用AuthenticAMD测试服务器的FLOPS性能。

使用linpack-xtreme-1.1.5软件对4颗E7-4890 V2 CPU (60核心120线程)的服务器进行测试,结果为:

CPU型号:Intel(R) Xeon(R) CPU E7-4890 v2 @ 2.80GHz

时间消耗:当使用60个CPU线程并行计算时,单个线程消耗的时间为 67.765 ~ 70.942, 68.279 (均值) / 68.245 68.279 (中位数)。
CPU性能:当使用60个CPU线程并行计算时,单个线程性能为 9.4002 ~ 9.8409, 9.767 (均值) / 9.7717 (中位数)。
CPU性能:当使用60个CPU线程并行计算时,所有线程总性能为 586.0235 GFlops。

时间消耗:当使用1个CPU线程并行计算时,单个线程消耗的时间为 29.587 ~ 29.587, 29.587 (均值) / 29.587 29.587 (中位数)。
CPU性能:当使用1个CPU线程并行计算时,单个线程性能为 22.5389 ~ 22.5389, 22.5389 (均值) / 22.5389 (中位数)。
CPU性能:当使用1个CPU线程并行计算时,所有线程总性能为 22.5389 GFlops。

时间消耗:当使用120个CPU线程并行计算时,单个线程消耗的时间为 189.257 ~ 278.805, 236.683 (均值) / 230.219 236.683 (中位数)。
CPU性能:当使用120个CPU线程并行计算时,单个线程性能为 2.3919 ~ 3.5236, 2.847 (均值) / 2.8967 (中位数)。
CPU性能:当使用120个CPU线程并行计算时,所有线程总性能为 341.6415 GFlops。

使用linpack-xtreme-1.1.5软件进行FLOPS计算的结果在一定程度上准确。在CPU最大核心数内进行测试时,使用的核心数越多,FLOPS结果越大,基本呈线性增加。此外,也在一定程度上不太准确。表现在:(1)服务器开启超线程,并行化数为CPU核心数的FLOPS值最大,而并行化为CPU线程数的FLOPS结果降低太多。(2)当使用单线程单任务进行测试时,FLOPS值非常高,是满负荷的两倍还多。我个人觉得单线程时CPU超频性能不会强这么多。(3)我使用8路服务器DL980G7(4颗E7-4870)进行测试时,其整体FLOPS值比4路服务器DL580G7(4颗E7-4870)的FLOPS值还低。这是很不正常的。所以,linpack-xtreme-1.1.5软件进行测试时,多物理CPU同时进行测试,会极大影响测试结果。linpack-xtreme-1.1.5软件可能仅适合单颗CPU的FLOPS计算。(4)在不同版本的CentOS系统下,或在相同系统相同型号而不同物理机器上测试结果差异较大。

最后,使用linpack-xtreme-1.1.5软件对一些服务器的FLOPS测试结果如下:

服务器型号         CPU型号数量        整体FLOPS           系统
惠普DL580G9       E7-8890 V3 * 4    1329.6549 GFlops    CentOS7
华为RH5885H V3    E7-4890 V2 * 4    1076.3384 GFlops    CentOS7
华为RH5885H V3    E7-4890 V2 * 4    814.6641 GFlops     CentOS7
华为RH5885H V3    E7-4890 V2 * 4    586.0235 GFlops     CentOS8
戴尔R910          E7-8870 * 4       346.8207 GFlops     CentOS8
惠普DL980G7       E7-4870 * 8       252.3831 GFlops     CentOS8
戴尔T620          E5-2620 * 2       198.8307 GFlops     CentOS7