跳转至

174 hpc hardware

CPU

算力

算力(Computational Power)在计算机科学和计算领域中是一个重要概念,它指的是计算机系统或设备执行数值计算和处理任务的能力。提升算力意味着可以更快地执行复杂的计算任务,从而提高计算的效率和性能,算力决定了计算机处理信息的速度和效率。

浮点运算

算力最基本的计量单位是 FLOPS (Floating-point Operations Per Second),即每秒执行的浮点运算次数。浮点运算其实就是带小数的加减乘除运算,常被用来估算电脑的执行效能,尤其是在使用到大量浮点运算的科学计算领域中。

浮点运算在某类应用软件中常常出现,而它们也比整数运算更花时间。现今大部分的处理器中,都有一个专门用来处理浮点运算的 "浮点运算器"(FPU)。也因此 FLOPS 所量测的,实际上就是FPU的执行速度。而最常用来测量 FLOPS 的基准(benchmark)之一,就是Linpack。

Linapck 测试:采用主元高斯消去法求解双精度稠密线性代数方程组,结果按每秒浮点运算次数 (flops) 表示。

HPL:针对大规模并行计算系统的测试,其名称为 High Performance Linpack(HPL),是第一 个标准的公开版本并行 Linpack 测试软件包。用于 TOP500 与国内 TOP100 排名依据。

一个MFLOPS(megaFLOPS)等于每秒一佰万(=10^6)次的浮点运算,
一个GFLOPS(gigaFLOPS)等于每秒拾亿(=10^9)次的浮点运算,
一个TFLOPS(teraFLOPS)等于每秒万亿(=10^12)次的浮点运算,
一个PFLOPS(petaFLOPS)等于每秒千万亿(=10^15)次的浮点运算,
一个EFLOPS(exaFLOPS)等于每秒百亿亿(=10^18)次的浮点运算
一个ZFLOPS(zettaFLOPS)等于每秒十万京(=10^21)次的浮点运算。

浮点数有不同的规格,常用的有以下几种:

  • FP16(半精度)占用2个字节(16 bit)
  • FP32(单精度)占用4个字节(32 bit)
  • FP64(双精度)占用8个字节(64 bit)

常用双精度浮点运算能力(FP64 FLOPS)衡量CPU的科学计算的能力,即处理64bit小数点浮动数据的能力,可以理解为单个CPU周期能够同时执行加法和乘法的指令的条数。

浮点运算能力计算公式:

FLOPS = 核数 * 单核主频 * CPU单周期浮点计算次数

  • 核数:CPU物理核数,非线程数

  • 单核主频:基频(Base Frequency),而非超频(Max Turbo Frequency),单位一般为 GHz

  • CPU单周期浮点计算次数:与CPU支持的指令集、FMA (fused multiply-add,乘加处理器,每个FMA可以对数据在一个时钟周期中做一次乘运算和一次加运算)数量有关:

    • 支持AVX512指令集,且FMA系数=2,所以CPU每周期算力值为:

      CPU单周期双精度浮点计算次数 = 2(FMA数量)* 2(同时加法和乘法)*512/64=32

      CPU单周期单精度浮点计算次数 = 2(FMA数量)* 2(同时加法和乘法)*512/32=64

    • AVX2指令集的CPU单周期浮点计算次数分别减半,即 16、32

不同指令集单周期单精度、双精度运算次数列表

指令集单周期单精度浮点计算次数单周期双精度浮点计算次数
HehalemSSE (128-bits)84
Sandy BridgeAVX (256-bits)168
HaswellAVX2 (256-bits)3216
PurleyAVX512 (512-btis)6432 (FMA=2)
16 (FMA=1)

举例如下:

  • Intel Xeon Gold 6348 ,28c,2.60 GHz,42MB,235w,AVX512

    6348双精算力 = 28 * 2.6(109)*(32)/(1012)=2.3 Tflops

    6348单精算力 = 28 * 2.3(109)*(64)/(1012)=4.6 Tflops

  • Intel Xeon E5-2680 v4,14c,3.30 GHz,35MB,120w,AVX2

    6348双精算力 = 14 * 2.3(109)*(16)/(1012)=0.52 Tflops

    6348单精算力 = 28 * 2.3(109)*(32)/(1012)=1.03 Tflops

AVX 指令集

AVX (Advanced Vector Extensions) 是 Intel 和 AMD 处理器的 SIMD (单指令多数据流) 指令集扩展。它们主要用于提高浮点运算的性能,特别是在科学计算、图形处理和其他需要大量数学运算的应用中。以下是关于 AVX, AVX2, AVX512 的详细说明:

  1. AVX (Advanced Vector Extensions)

    • 引入时间:2011年,首次出现在 Intel 的 Sandy Bridge 架构和 AMD 的 Bulldozer 架构中。

    • 主要特点:

      • 扩展了 SIMD 向量的宽度从 128 位增加到 256 位,这意味着它可以在单个指令中处理更多的数据。

      • 引入了新的 YMM 寄存器,这些寄存器是 XMM 寄存器的扩展。

      • 支持浮点和整数数据的操作。

      • 提供了更好的性能和更低的功耗。

    • 应用领域:科学计算、3D 图形渲染、音频和视频处理、金融分析等。

  2. AVX2 (Advanced Vector Extensions 2)

    • 引入时间:2013年,首次出现在 Intel 的 Haswell 架构中。

    • 主要特点:

      • 在 AVX 的基础上增加了整数指令,特别是对 256 位整数向量的支持。

      • 引入了 FMA (Fused Multiply-Add) 指令,这允许在单个操作中进行乘法和加法,从而提高性能并减少舍入误差。

      • 提供了更多的数据置换和混合指令,这对于某些算法非常有用。

      • 支持更丰富的位操作,如位移、旋转和计数。

    • 应用领域:与 AVX 相同,但由于其增强的整数和位操作功能,它在某些特定应用中提供了更好的性能。

  3. AVX-512 (Advanced Vector Extensions 512-bit)

    • 引入时间: 2016年,首次出现在 Intel 的 Skylake-X 和 Xeon Phi 处理器中。

    • 主要特点:

      • 宽度扩展: 将向量宽度扩展到512位,使其能够在单个指令中处理更多的数据。

      • 新增寄存器: 引入了新的 ZMM 寄存器,这些寄存器是 YMM 寄存器的扩展,每个寄存器宽度为512位。

      • 增强的浮点和整数运算: 支持更多的浮点运算指令(包括 FMA)和整数运算指令。

      • 掩码寄存器: 引入了新的掩码寄存器(k0-k7),用于控制操作的元素掩码,实现更灵活的数据处理。

      • 高级数据操作: 支持更复杂的数据操作,如数据压缩和解压缩、元素级别的条件操作等。

      • 性能提升: 提供了显著的性能提升,特别是在大规模并行计算、科学计算和数据分析中。

      • 每个时钟周期内处理 32次双精度浮点运算、64次单精度浮点运算、8次64位整数操作、16次32位整数操作。

    • 应用领域:

      • 科学计算: 在需要处理大规模数据集的科学计算中,AVX-512 提供了显著的性能提升。

      • 数据分析: 在数据密集型应用如机器学习和大数据处理方面,AVX-512 允许更快的数据处理。

      • 图形渲染: 用于高性能图形渲染和视觉计算,提供更高的数据处理能力。

      • 加密: 加速加密算法和安全计算。

      • 金融分析: 在复杂的金融模型和计算中,AVX-512 提供了更高的计算能力和效率。

AVX 是为了提高并行处理能力和性能而设计的。它们在处理大量数据时特别有用,例如在图形处理、机器学习、科学模拟等领域。

cpufp

A CPU tool for benchmarking the peak of floating points

https://github.com/pigirons/cpufp

# 单核
$ ./cpufp --thread_pool=[0]
Number Threads: 1
Thread Pool Binding: 0
--------------------------------------------------------------
| Instruction Set | Core Computation      | Peak Performance |
| AVX512F         | FMA(f32,f32,f32)      | 159.21 GFLOPS    |
| AVX512F         | FMA(f64,f64,f64)      | 79.592 GFLOPS    |
| FMA             | FMA(f32,f32,f32)      | 79.607 GFLOPS    |
| FMA             | FMA(f64,f64,f64)      | 39.794 GFLOPS    |
| AVX             | ADD(MUL(f32,f32),f32) | 39.78 GFLOPS     |
| AVX             | ADD(MUL(f64,f64),f64) | 19.896 GFLOPS    |
| SSE             | ADD(MUL(f32,f32),f32) | 9.949 GFLOPS     |
| SSE2            | ADD(MUL(f64,f64),f64) | 4.9749 GFLOPS    |
--------------------------------------------------------------
# 所有核
$ ./cpufp --thread_pool=[0-35]
Number Threads: 36
Thread Pool Binding: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
--------------------------------------------------------------
| Instruction Set | Core Computation      | Peak Performance |
| AVX512F         | FMA(f32,f32,f32)      | 5.7096 TFLOPS    |
| AVX512F         | FMA(f64,f64,f64)      | 2.8339 TFLOPS    |
| FMA             | FMA(f32,f32,f32)      | 2.805 TFLOPS     |
| FMA             | FMA(f64,f64,f64)      | 1.4246 TFLOPS    |
| AVX             | ADD(MUL(f32,f32),f32) | 1.4184 TFLOPS    |
| AVX             | ADD(MUL(f64,f64),f64) | 692.64 GFLOPS    |
| SSE             | ADD(MUL(f32,f32),f32) | 352.46 GFLOPS    |
| SSE2            | ADD(MUL(f64,f64),f64) | 176.86 GFLOPS    |
--------------------------------------------------------------
# 单核
$ ./cpufp --thread_pool=[0]
Number Threads: 1
Thread Pool Binding: 0
--------------------------------------------------------------
| Instruction Set | Core Computation      | Peak Performance |
| AVX             | ADD(MUL(f32,f32),f32) | 42.797 GFLOPS    |
| AVX             | ADD(MUL(f64,f64),f64) | 25.653 GFLOPS    |
| SSE             | ADD(MUL(f32,f32),f32) | 27.624 GFLOPS    |
| SSE2            | ADD(MUL(f64,f64),f64) | 12.963 GFLOPS    |
--------------------------------------------------------------
# 所有核
$ ./cpufp --thread_pool=[0-19]
Number Threads: 20
Thread Pool Binding: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
--------------------------------------------------------------
| Instruction Set | Core Computation      | Peak Performance |
| AVX             | ADD(MUL(f32,f32),f32) | 944.41 GFLOPS    |
| AVX             | ADD(MUL(f64,f64),f64) | 473.77 GFLOPS    |
| SSE             | ADD(MUL(f32,f32),f32) | 479.09 GFLOPS    |
| SSE2            | ADD(MUL(f64,f64),f64) | 238.58 GFLOPS    |
--------------------------------------------------------------

HPL

https://icl.utk.edu/hpl/software/index.html

https://docs.hpc.sjtu.edu.cn/app/benchtools/hpl.html

HPCG

https://www.hpcg-benchmark.org/software/index.html

参考

https://blog.csdn.net/LENG_Lingliang/article/details/127464160

https://blog.csdn.net/github_36774378/article/details/135650765

高性能计算|硬件架构与基准测试

浮点峰值那些事儿

关于CPU的浮点运算能力计算

AVX指令集是什么?它的应用又有哪些?

英特尔®指令集扩展技术

又拍云--深入了解浮点运算——CPU 和 GPU 算力是如何计算的

又拍云--加速计算,为何会成为 AI 时代的计算力“新宠”

从GTX到RTX NVIDIA GPU架构的变迁史

NVIDIA GPU 架构演进

NVIDIA GPU 架构演进(续)

如何进行HPL测试

如何进行HPCG测试

GPU

网络

参考

使用Perftest对RoCEv2性能进行测试

RoCE在HPC中的应用分析

内存

内存带宽 = 内存频率 ×64 ÷8 ×通道数

内存频率 就是买内存时标称的频率,而不是CPU-Z里将上升沿和下降沿合起来(即除了2)的那种

×64 表示每次能传输64bit的数据

÷8 是将bit转成成byte

参考

如何进行stream测试

存储

fio

https://blog.csdn.net/qq_42776455/article/details/108793391

https://help.aliyun.com/zh/ecs/user-guide/test-the-performance-of-block-storage-devices

https://lovethegirl.github.io/2019/12/04/fio/

下载地址 https://brick.kernel.dk/snaps/

wget https://brick.kernel.dk/snaps/fio-3.38.tar.gz
tar xf fio-3.38.tar.gz
cd fio-3.38/
./configure
make -j12 && make install
使用举例
# 随机写测试
fio -filename=/home/benchmark/fiotest -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

fio -filename=/dev/your_device  -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting  -name=Rand_Write_Testing

# 顺序写测试
fio -filename=/home/benchmark/fiotest -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytes

# ARM 节点
 ~/opt/arm/fio/3.38/bin/fio -filename=/share/home/liuhao/benchmarch/fio-test -direct=1 -iodepth=32 -rw=randwrite -ioengine=psync  -bs=4k -numjobs=30 -time_based=1 -runtime=300 -group_reporting -name=mytest
参数说明
filename=/home/benchmark/fiotest       测试文件名称,通常选择需要测试的盘的data目录。
direct=1                 测试过程绕过机器自带的buffer。使测试结果更真实。
bs=16k                   单次io的块文件大小为16k
bsrange=512-2048         同上,提定数据块的大小范围
size=5g    本次的测试文件大小为5g,以每次4k的io进行测试。
numjobs=30               本次的测试线程为30.
runtime=1000             测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。
ioengine=psync           io引擎使用pync方式
rwmixwrite=30            在混合读写的模式下,写占30%
group_reporting          关于显示结果的,汇总每个进程的信息
lockmem=1g               只使用1g内存进行测试。
zero_buffers             用0初始化系统buffer。
nrfiles=8                每个进程生成文件的数量
log_avg_msec=1000        日志打印时间
iodepth=1                表示测试时的IO队列深度。例如-iodepth=128表示FIO控制请求中的I/O最大个数为128。
读写模式
rw=read 顺序读
rw=write 顺序写
rw=readwrite 顺序混合读写
rw=randwrite 随机写
rw=randread 随机读
rw=randrw 随机混合读写

性能监控

CoreFreq

监控各CPU核实时频率变化比较方便

$ git clone https://github.com/cyring/CoreFreq.git
$ cd CoreFreq
$ make 
加载 Linux 内核模块、运行守护程序。
$ insmod ./build/corefreqk.ko
$ ./build/corefreqd
启动客户端
$ ./build/corefreq-cli
打开的界面中,可使用快捷键: 1. 使用 F2 显示屏幕顶部显示的使用菜单。 2. 使用 右 和 左 箭头移动菜单选项卡。 3. 使用 上和 下 箭头选择菜单项,然后单击回车。 4. 使用 F4 关闭程序。 5. 使用 h 打开快速参考。

intel-pcm

https://github.com/intel/pcm

pcm :基础的处理器监控工具(每个cycle的指令,核心频率-包括 Intel Turbo Boost技术和intel_pstate ,内存,Intel快速路径内部连接带宽(Intel Quick Patch Interconnct bandwidth),本地和远程内存带宽,缓存未命中,core和CPU封装(CPU package)睡眠C-state定位(residency),core和CPU封装的热余量(thermal headroom),缓存使用,CPU和内存能耗(energy consumption)

pcm-sensor-server : 通过http以 JSON 或者 Prometheus监控 (基于文本的 pcm-exporter :Intel Performance Counter Monitor (Intel PCM) Prometheus exporter )格式输出

pcm-memory : 监控内存带宽(每个通道和每个DRAM DIMM rank)

pcm-power : 监控处理器的睡眠和能源状态、Intel Quick Path Interconnect、DRAM 内存、CPU 频率限制的原因以及其他能源相关指标

与 Prometheus配合 Intel PCM Grafana

dool

Python3 compatible fork of dstat

可同时监控多个指标、包括infiniband流量

https://github.com/scottchiefbaker/dool

$ ~/bin/dool -f
Using default plugins: cpu, disk, net, load
┄┄total┄cpu┄usage┄┄┬┄┄dsk/sda┄┄┬┄┄net/eno1┄┄┄┄net/eno3┄┄┄┄net/eno4┄┄net/enp0s20┄┄┄net/ib0┄┄┬┄┄┄load┄avg┄┄┄┬┄┄┄┄┄system┄┄┄┄
usr sys idl wai stl│ read  writ│ recv  send  recv  send  recv  send  recv  send  recv  send│ 1m   5m  15m       time     
  3   1  97   0   0 204k  841k│   0     0    0     0    0     0    0     0    0     0 │0.53 0.57 0.65│Aug-11 11:18:53
  1   1  99   0   0   0    66k│ 333k  178k┊ 960b    0   42k   18k┊  15k    0    0     0 │0.53 0.57 0.65│Aug-11 11:18:54
  1   0  99   0   0   0   229k│ 451k  213k┊7392b    0   40k 6304b┊ 800b    0    0     0 │0.56 0.58 0.65│Aug-11 11:18:55
  0   0 100   0   0   0     0  389k  135k┊2400b    0   22k 5200b┊ 576b    0    0     0 │0.56 0.58 0.65│Aug-11 11:18:56
  1   0  99   0   0   0     0  355k  102k┊5136b    0   24k 5072b┊ 576b    0    0     0 │0.56 0.58 0.65│Aug-11 11:18:57
  0   0  99   0   0   0     0  319k   70k┊1920b    0   47k 7040b┊ 224b    0    0     0 │0.56 0.58 0.65│Aug-11 11:18:58
  1   1  98   0   0   0   131k│ 279k   54k┊6912b    0   40k 7712b┊ 224b    0    0     0 │0.56 0.58 0.65│Aug-11 11:18:59
  3   1  96   0   0   0  1049k│ 328k  179k┊2400b    0   22k   13k┊ 800b    0    0     0 │0.76 0.62 0.66│Aug-11 11:19:00
  2   1  97   0   0   0     0  390k  228k┊4176b    0   22k   11k┊ 576b    0    0     0 │0.76 0.62 0.66│Aug-11 11:19:01
  2   0  98   0   0   0     0  771k  436k┊ 960b    0   30k 5936b┊ 576b    0    0     0 │0.76 0.62 0.66│Aug-11 11:19:02
  1   0  98   0   0   0     0  566k  521k┊7296b    0   47k   11k┊   0     0    0     0 │0.76 0.62 0.66│Aug-11 11:19:03
  3   1  97   0   0   0   229k│ 434k  129k┊  19k    0   39k 7648b┊ 800b    0    0     0 │0.76 0.62 0.66│Aug-11 11:19:04
  1   1  98   0   0   0   131k│ 408k  198k┊1440b    0   23k 6800b┊ 800b    0    0     0 │0.70 0.61 0.66│Aug-11 11:19:05     
  ```
```bash
$ ls ~/.dool/
dool_battery.py         dool_fan.py            dool_mongodb_opcount.py      dool_nfsstat4.py      dool_squid.py            dool_vm_cpu.py
dool_battery_remain.py  dool_freespace.py      dool_mongodb_queue.py        dool_ntp.py           dool_test.py             dool_vmk_hba.py
dool_bond.py            dool_fuse.py           dool_mongodb_stats.py        dool__pid_detail.py   dool_thermal.py          dool_vmk_int.py
dool_condor_queue.py    dool_gpfs_ops.py       dool_mysql5_cmds.py          dool_postfix.py       dool_top_bio_adv.py      dool_vmk_nic.py
dool_cpufreq.py         dool_gpfs.py           dool_mysql5_conn.py          dool_power.py         dool_top_bio.py          dool_vm_mem_adv.py
dool_dbus.py            dool_helloworld.py     dool_mysql5_innodb_basic.py  dool_proc_count.py    dool_top_childwait.py    dool_vm_mem.py
dool_disk_avgqu.py      dool_ib.py             dool_mysql5_innodb_extra.py  dool_qmail.py         dool_top_cpu_adv.py      dool_vz_cpu.py
dool_disk_avgrq.py      dool_innodb_buffer.py  dool_mysql5_innodb.py        dool_redis.py         dool_top_cpu.py          dool_vz_io.py
dool_disk_inflight.py   dool_innodb_io.py      dool_mysql5_io.py            dool_rpcd.py          dool_top_cputime_avg.py  dool_vz_ubc.py
dool_disk_svctm.py      dool_innodb_ops.py     dool_mysql5_keys.py          dool_rpc.py           dool_top_cputime.py      dool_wifi.py
dool_disk_tps.py        dool_jvm_full.py       dool_mysql_io.py             dool_sendmail.py      dool_top_int.py          dool_zfs_arc.py
dool_disk_util.py       dool_jvm_vm.py         dool_mysql_keys.py           dool_snmp_cpu.py      dool_top_io_adv.py       dool_zfs_l2arc.py
dool_disk_wait.py       dool_lustre.py         dool_net_packets.py          dool_snmp_load.py     dool_top_io.py           dool_zfs_zil.py
dool_dool_cpu.py        dool_md_status.py      dool_nfs3_ops.py             dool_snmp_mem.py      dool_top_latency_avg.py
dool_dool_ctxt.py       dool_memcache_hits.py  dool_nfs3.py                 dool_snmp_net_err.py  dool_top_latency.py
dool_dool_mem.py        dool_mem_percent.py    dool_nfsd3_ops.py            dool_snmp_net.py      dool_top_mem.py
dool_dool.py            dool_mongodb_conn.py   dool_nfsd3.py                dool_snmp_sys.py      dool_top_oom.py
dool_dool_step.py       dool_mongodb_mem.py    dool_nfsd4_ops.py            dool_snooze.py        dool_utmp.py

collectl

https://collectl.sourceforge.net/

可监控infiniband流量

$ collectl -snx
waiting for 1 second sample...
#<----------Network----------><-----------InfiniBand----------->
#  KBIn  PktIn  KBOut  PktOut    KBIn  PktIn   KBOut PktOut Errs 
      1      8      0       3      13    279    3601   1068    0 
      2     11      1       4   24564   6858   13057   4029    0 
      4     39      1       6      16    359    5532   1597    0 
      4     35      2       6      36    782   30391   7985    0 
      3     31      0       2      15    318    3294   1036    0 
      3     12      0       3   16498   4450    3405   1243    0 
      4     37      1       4      36    777    8859   2794    0 
      6     56      3      26   10701   4042  239871  60064    0 
      4     36      1       4      44    972   55721  14327    0 
      3     11      0       3      22    489    7934   2284    0 
      4     26      2      14      24    539   23585   6163    0 
      8     73      6      42      33    709   10010   3025    0 
     13    113     12      85      10    224    3746   1070    0 
同时监控多个节点
$ colmux  -column 0 -reverse -address c03n[01-14] -command "-snx"

PerTaskMemBWMonitoring

每个进程的内存带宽监控

参考

CoreFreq:一款强大的监控 CPU 的专业工具

Linux系统之dool命令行工具的基本使用

Linux系统监控神器--Collectl

https://lmbench.sourceforge.net/man/index.html

参考

GPU 进阶笔记(一):高性能 GPU 服务器硬件拓扑与集群组网(2023)

本文阅读量  次
本站总访问量  次