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
不同指令集单周期单精度、双精度运算次数列表
| 指令集 | 单周期单精度浮点计算次数 | 单周期双精度浮点计算次数 | |
|---|---|---|---|
| Hehalem | SSE (128-bits) | 8 | 4 |
| Sandy Bridge | AVX (256-bits) | 16 | 8 |
| Haswell | AVX2 (256-bits) | 32 | 16 |
| Purley | AVX512 (512-btis) | 64 | 32 (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 的详细说明:
AVX (Advanced Vector Extensions)
引入时间:2011年,首次出现在 Intel 的 Sandy Bridge 架构和 AMD 的 Bulldozer 架构中。
主要特点:
扩展了 SIMD 向量的宽度从 128 位增加到 256 位,这意味着它可以在单个指令中处理更多的数据。
引入了新的 YMM 寄存器,这些寄存器是 XMM 寄存器的扩展。
支持浮点和整数数据的操作。
提供了更好的性能和更低的功耗。
应用领域:科学计算、3D 图形渲染、音频和视频处理、金融分析等。
AVX2 (Advanced Vector Extensions 2)
引入时间:2013年,首次出现在 Intel 的 Haswell 架构中。
主要特点:
在 AVX 的基础上增加了整数指令,特别是对 256 位整数向量的支持。
引入了 FMA (Fused Multiply-Add) 指令,这允许在单个操作中进行乘法和加法,从而提高性能并减少舍入误差。
提供了更多的数据置换和混合指令,这对于某些算法非常有用。
支持更丰富的位操作,如位移、旋转和计数。
应用领域:与 AVX 相同,但由于其增强的整数和位操作功能,它在某些特定应用中提供了更好的性能。
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 和 GPU 算力是如何计算的
GPU¶
网络¶
参考¶
内存¶
内存带宽 = 内存频率 ×64 ÷8 ×通道数
内存频率 就是买内存时标称的频率,而不是CPU-Z里将上升沿和下降沿合起来(即除了2)的那种
×64 表示每次能传输64bit的数据
÷8 是将bit转成成byte
参考¶
存储¶
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
$ insmod ./build/corefreqk.ko
$ ./build/corefreqd
$ ./build/corefreq-cli
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¶
每个进程的内存带宽监控
参考¶
https://lmbench.sourceforge.net/man/index.html
参考¶
GPU 进阶笔记(一):高性能 GPU 服务器硬件拓扑与集群组网(2023)
本文阅读量 次本站总访问量 次