22级第一次学习任务
安装OneAPI、HPL与HPCG
安装过程中遇到的问题:
1.磁盘容量不足
解决方法:扩容,扩到了100G
2.安装HPL中遇到
①找不到mpiicc
②
解决方法:
①在参考1中发现为环境变量未配置,将其配置
②则为gcc版本问题,将其降为9.5.0即解决问题
HPL优化测试
理论峰值的计算
Linux中CPU信息
liling@liling-virtual-machine:~/桌面$ lscpu
架构: x86_64
CPU 运行模式: 32-bit, 64-bit
Address sizes: 45 bits physical, 48 bits virtual
字节序: Little Endian
CPU: 16
在线 CPU 列表: 0-15
厂商 ID: AuthenticAMD
型号名称: AMD Ryzen 7 6800H with Radeon Graphics
CPU 系列: 25
型号: 68
每个核的线程数: 1
每个座的核数: 4
座: 4
步进: 1
BogoMIPS: 6388.00
具体计算过程
计算公式:CPU峰值浮点计算性能 = CPU核数×CPU频率×每周期执行的浮点操作数
liling@liling-virtual-machine:~/桌面$ cat /proc/cpuinfo |grep MHz | uniq -c
4 cpu MHz : 3194.001
Rpeak=16x 3.2 x (4 + 2 x 8) = 1024GFLOPS
FMA指令集是一种能够同时进行乘法和加法的指令集,每个FMA操作相当于执行了一个乘法和一个加法。
因此,如果将FMA操作视为两个浮点操作,也可以使用8 x 3.2x (4 + 2 x 8) = 512 GFLOPS的公式进行计算。
一般来说,将一个FMA操作视为两个浮点操作更为常见,因为FMA操作实际上相当于执行了两个浮点操作。
对于AMD Ryzen 7 6800X处理器,它的核心数为8,主频为3.2GHz,每个周期可以执行4个浮点操作,同时还支持FMA指令集,每个周期可以执行8个FMA操作。因此,计算公式应该是8x 3.2 x (4 + 2×8) = 512GFLOPS。
关键参数的选择与优化
已将其他参数改为推荐配置
p和Q(1×4最佳)
①在Ns=19200,NB=256的情况下
进程数 | P | Q | Time | Glops | 峰值性能 |
---|---|---|---|---|---|
16 | 1 | 16 | 24.32 | 1.9408e+02 | 18.95% |
16 | 2 | 8 | 21.44 | 2.2013e+02 | 21.50% |
16 | 4 | 4 | 21.28 | 2.2175e+02 | 21.66% |
16 | 8 | 2 | 28.98 | 1.6285e+02 | 15.90% |
16 | 16 | 1 | 24.12 | 1.9562e+02 | 19.10% |
意识到不太对劲了,性能有点小啊,开始尝试改CPU核数
Rpeak=8×20×3.2=512Gflops
进程数 | P | Q | Time | Glops | 峰值性能 |
---|---|---|---|---|---|
8 | 1 | 8 | 18.53 | 2.5465e+02 | 49.74% |
8 | 2 | 4 | 18.90 | 2.4970e+02 | 48.77% |
8 | 4 | 2 | 20.10 | 2.3477e+02 | 45.85% |
8 | 8 | 1 | 无欸,竟然不跑 | 又跑了一边4×2的 | ??? |
Rpeak=4×20×3.2=256Gflops
进程数 | P | Q | Time | Glops | 峰值性能 |
---|---|---|---|---|---|
4 | 1 | 4 | 28.96 | 1.6285e+02 | 63.61% |
4 | 2 | 2 | 29.77 | 1.5852e+02 | 61.92% |
4 | 4 | 1 | 31.86 | 1.4814e+02 | 57.86% |
通过尝试对比可至,CPU核数为4最适宜
现在正式测P、Q了
WC10R2C4 19200 128 1 4 27.16 1.7374e+02
WC10R2C8 19200 128 1 4 27.13 1.7394e+02 WC10R2C4 19200 128 2 2 28.10 1.6796e+02
WC10R2C8 19200 128 2 2 28.06 1.6815e+02 WC10R2C4 19200 128 4 1 30.73 1.5356e+02
WC10R2C8 19200 128 4 1 29.89 1.5789e+02
WC10R2C4 19200 180 1 4 26.22 1.8001e+02
WC10R2C8 19200 180 1 4 26.14 1.8053e+02 WC10R2C4 19200 180 2 2 26.89 1.7553e+02
WC10R2C8 19200 180 2 2 26.80 1.7610e+02 WC10R2C4 19200 180 4 1 27.78 1.6988e+02
WC10R2C8 19200 180 4 1 28.18 1.6747e+02
WC10R2C4 19200 256 1 4 26.43 1.7858e+02
WC10R2C8 19200 256 1 4 26.33 1.7926e+02 WC10R2C4 19200 256 2 2 27.87 1.6932e+02
WC10R2C8 19200 256 2 2 27.82 1.6965e+02 WC10R2C4 19200 256 4 1 29.03 1.6254e+02
WC10R2C8 19200 256 4 1 28.89 1.6335e+02
WC10R2C4 9200 128 1 4 3.43 1.5154e+02
WC10R2C8 9200 128 1 4 3.49 1.4898e+02 WC10R2C4 9200 128 2 2 3.64 1.4262e+02
WC10R2C8 9200 128 2 2 3.62 1.4337e+02 WC10R2C4 13440 128 2 2 10.55 1.5338e+02
WC10R2C8 13440 128 2 2 10.49 1.5427e+02 WC10R2C4 13440 128 1 4 10.14 1.5962e+02
WC10R2C8 13440 128 1 4 10.06 1.6089e+02
WC10R2C4 9200 180 1 4 3.44 1.5077e+02
WC10R2C8 9200 180 1 4 3.43 1.5149e+02 WC10R2C4 9200 180 2 2 3.48 1.4921e+02
WC10R2C8 9200 180 2 2 3.44 1.5105e+02 WC10R2C4 13440 180 1 4 10.17 1.5911e+02
WC10R2C8 13440 180 1 4 9.92 1.6316e+02 WC10R2C4 13440 180 2 2 9.96 1.6247e+02
WC10R2C8 13440 180 2 2 10.00 1.6193e+02
WC10R2C4 9200 190 1 4 3.43 1.5137e+02
WC10R2C8 9200 190 1 4 3.48 1.4935e+02 WC10R2C4 9200 190 2 2 3.52 1.4754e+02
WC10R2C8 9200 190 2 2 3.54 1.4651e+02 WC10R2C4 13440 190 1 4 9.90 1.6348e+02
WC10R2C8 13440 190 1 4 10.00 1.6185e+02 WC10R2C4 13440 190 2 2 10.30 1.5713e+02
WC10R2C8 13440 190 2 2 10.36 1.5630e+02
在此浅列几组数据,经过多组实验可证得
P×Q最佳为1×4
N和NB
如果 N 设置得太小会导致低性能表现;一般矩阵占据系统内存80%为最佳。
由此公式,再加上free -b命令
我的最佳N应该是(5051523072*0.8/8)^(1/2)=22476
NB值的选择主要是通过实际测试得到最优值。但NB的选择上还是有一些规律可寻,如: NB不可能太大或太小,一般在256以下;NB × 8一定是Cache line的倍数等;大小几乎总是在 [32 … 256] 区间内;最佳值取决于系统的计算/通信性能比。 通过先小规模抽取、再大规模验证(小规模测试选择3个性能表现不错的 NB,再通过大规模测试验证这些选择)的方法
多次测试 挑出最优数据
Gflops | NS=19200 | NS=22476(理论最佳) | NS=26680 | NS=27000 | NS=28000 |
---|---|---|---|---|---|
NB=128 | 1.9083e+02 | 1.9430e+02 | 1.9930e+02 | 1.9912e+02 | 1.9654e+02 |
NB=192 | 1.9862e+02 | 2.0210e+02 | 1.9052e+02 | 2.0461e+02 | 1.9935e+02 |
NB=200 | 1.9785e+02 | 2.0269e+02 | 2.0287e+02 | 1.9903e+02 | 2.0633e+02 |
NB=232 | 1.9785e+02 | 1.8506e+02 | 2.0404e+02 | 1.9922e+02 | 2.0189e+02 |
NB=240 | 2.0104e+02 | 1.9053e+02 | 1.9193e+02 | 2.0700e+02 | 1.9327e+02 |
NB=248 | 1.9799e+02 | 1.8946e+02 | 2.0365e+02 | 2.0532e+02 | 2.0089e+02 |
NB=256 | 1.9625e+02 | 2.0337e+02 | 2.0273e+02 | 2.0485e+02 | 1.9990e+02 |
此前已经进行了 NS=9200 10000 13000 等较小数据测算 ,搭配NB=32 64 128 发现数据在13000以下达不到1.80e+02
中途还用了 cat /proc/cpuinfo 看了自己没开超线程
若siblings=cpu cores 不支持超线程或未启用超线程
若siblings>cpu cores 支持并启用超线程
有一次数据跑得超级烂,前一天相同的能跑1.85+,那一次却只能跑1.65左右
用了命令清理了sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches缓存内存,数据果然变好了很多
又通过奥创开了性能增强和独显输出,加上进程实时,数据好看很多,以前较为理想的数据基本都能维持在1.95e+02-2.07e+02之间
最终结果
最后最优组合为
N=27000
NB=240
P×Q=1×4
最优Gflops=80%左右
总结
在后面几天还实验了下WSL,但是由于截至在即,目前最优是在VM中跑出来的,WSL还在调试😉
技术还需磨练与实践,Linux命令还需精进
筛选了部分原数据与优化后的实验数据,附在Excel中