|
本帖最后由 ggdh 于 2022-5-4 11:39 编辑
【更新3.0,支持orca】
-p orca
对orca进行测试
-b "%TDDFT NROOTS 3\nEND""
输入orca block风格的指令
-H
读取该目录下最后一次测试使用的命令,如果在某个目录下输入命令进行测试完毕,后面想回到这个目录下查看之前的结果,直接输入下面的命令即可
xbench.sh -H
-m
之前-m 100 是给每个任务设置100GB内存, 现在新增
-m 2000c
的用法,意思是给每个core分配2000MB的内存
-P
设置计算算力的分子,之前是1000,但是对于一些比较大的任务,这个值不够(比如一个任务耗时10000秒,那么算力就只有0.1了),所以现在可以用-P选项设置设置更大的分子。
一些orca的测试命令的例子可以参考
ORCA并行效率小测试
【更新2.0,支持NUMA】
NUMA的详细的介绍见:NUMA策略对Gaussian运算速度影响的小研究
通过对NUMA实现明确的控制,可以避免测试过程中出现的因为cpu的随机分配导致的NUMA状态不同,引起运行效率波动。
要想实现NUMA awareness 需要安装numactl工具包
使用
或者
- sudo apt-get install numactl
复制代码 进行安装
安装完成后,脚本如果发现numactl命令可用,会自动选择默认的NUMA策略,以避免bench中的波动。
另外脚本通过-N选项从三种NUMA策略选择,分别是:
-N dist
每一个任务都尽量均匀的分布在所有的NUMA节点上,这个是默认设置
-N loc
优先把一个NUMA节点占满,然后才使用下一个
-N semi
每个任务优先放在一个NUMA节点上运行,但是不同的任务尽量分配在不同节点上。
-N 设定的不同策略最终会转换为numactl的-C选项,也就是分配不同的核心id给不同的任务。
另外还有-M选项用来添加额外的numactl选项,比如用下面的一些内存策略
--localalloc 只从当前NUMA节点上分配内存
--membind=1 只从1号NUMA节点上分配内存
--preferred=0 从0号NUMA节点上分配内存,如果失败了(内存不够了)就尝试其他node
--interleave=0,1 从0,1号两个NUMA节点上轮流分配内存
下面是正文
受这个帖子启发:AMD Ryzen 高斯评测(及脚本),开发了一个方便测试的脚本xbench.sh
基于shell script开发,兼容正常的linux版本。
脚本特性:
- 内置输入文件,也可读取外部文件。
- 一次测试多核,多任务情况。
- 读取已经测试完结果(中断测试后不用重新开始)。
- 自动检测cpu型号,内存,系统,测试过程中检测cpu温度,频率等系统信息。
- 可以设置重复测试次数,自动计算平均值。
- 输出结果打印在屏幕上,同时保持在文件中,方便查看。
- [待开发]以后更新的版本计划会支持不同的量化程序,以及增加对numa的支持,更新后会相应的更新本帖
脚本安装
先安装依赖包,用来检查cpu温度和linux版本,当然如果没有管理员权限,不安装也没有关系。
- sudo yum install lm_sensors lsb-release
复制代码 然后将脚本加入PATH中,如果不知道怎么操作,把脚本拷贝到服务器上,然后cd到脚本所在目录,按下列步骤输入命令
- chmod +x xbench.sh
- mkdir ~/scripts
- cp xbench.sh ~/scripts
- echo 'export PATH=~/scripts:$PATH' >> ~/.bashrc
- source ~/.bashrc
复制代码
脚本使用说明
查看帮助:
这里先举一个简单的例子说明脚本的用法,以及对脚本的输出做一个说明,后面的Tips部分,以及后面的具体测试部分会给出更多的脚本使用示例。
下面的命令进行了一个单任务并行效率测试:
- xbench.sh -n 4,4,12 -t 1 -r 3 -S
复制代码 命令说明:
从4核开始,每次增加4核,一直到12核为止(-n 4,4,12)
一次只同时跑一个任务(-t 1)
每个任务跑3次取平均值(-r 3)
查看内存详细信息(-S),这里需要提供管理员密码(这个选项非必需)
命令输出以及解释:
a)测试前输出信息
从上到下依次包括了cpu的型号,核心数,当前cpu频率,当前cpu温度,总内存/可用内存,内存详细信息,linux发行版本和内核版本,运行命令,以及测试的规划。
b)测试过程中的输出信息
TASK_N004_T001 说明正在测试的是4核任务(N004),并且同时只算一个任务(T001),当前目录下也会产生一个XBENCH_N004_T001的文件夹,对应的计算和统计信息也会在这个文件夹当中进行。
step 1/3 说明一共重复三次,当前是第一次。
freq@30s: 显示的是任务开始30s后测试一下cpu的运行频率,3.40GHz@4c,说明有4个cpu核心的运行频率是3.4GHz。
time, cpu,mem,temp,是当前任务完成后,对运行时间(秒),cpu占用率,内存使用大小,当前cpu温度进行的统计。
c)测试完成后的输出信息
从左到右依次是:
Core:分配的cpu核数
Task:同时进行的任务数
MEM:单个任务分配的内存(GB)
TOTs:单个任务的平局耗时(s for single task)
TOTa:等于TOTs除以同时进行的任务数(a for all task,可以这么理解:如果同时算两个任务,每个任务花费20秒,那就相当于算一个任务只用了10秒)
power:算力=1000/TOTa
CoreU:单个任务运行实际占用核数
MemU:单个任务实际消耗内存数(GB)
Freq:运行单个任务cpu核心的频率
502s/502a/703s/703a:最消耗时间的两个link的耗时,s/a的意义和之前一样。
脚本使用Tips【重要】
a)快速查看硬件配置
直接输入脚本不加任何参数可以快捷的查看当前的系统的硬件环境
如果加上-S选项(需要管理员权限)还可以查看内存是怎么插的(有助于判断内存是否插对,多通道是否完全开启)
b)选择测试程序
默认测试g16,如果机器上同时装有g09和g16,可以用-p g09 来选择测试g09,以后会加入其他程序也用-p选项来选择。
c)设置输入文件和关键词
自带的测试输入文件是Gaussian的Test397,默认的关键词是
#p b3lyp 3-21g force test scf=novaracc int(fine,acc2e=10)
用户可以使用-k选项自己指定关键词
或者用-f选项测试自己的输入文件
或者是直接编辑这个脚本,修改其中输入文件的关键词
d)利用断点续算功能
脚本支持读取算好的结果,如果某个测试异常中断,直接输入之前的测试命令就能实现续算。
另外利用此功能还能实现一些便捷操作,比如用户输入了下面的命令进行了测试:
这个测试的意思是测试不同数量的4核任务同时运行时计算速度。
测试完成后用户在同一目录下输入
这个测试的意思是测试单个任务4核或者8核运算时的速度,然后一次只有一个任务同时运行。
由于前一个测试中已经跑过了单个任务4核独自运行的情况。
脚本会检查到当然目录中已经存在的XBENCH_N004_T001文件夹,以及该文件夹中有算好的结果。
因此会省略此步计算。直接从找到的文件夹中读取结果。
同理,如果这时候用户输入
- xbench.sh -n "4 8" -t 1 -r 3
复制代码
加了-r 3选项,表示测三次取平均值,由于之前已经测过一次。因此程序会自动发现之前的测试结果,然后只需再算二遍就能完成。
e)设置总核数和内存
默认使用80%的空闲内存,可以用-m选项设定单个任务的内存。用-c选项设定系统的总核数。比如
- xbench.sh -c 40 -n M -t 4,4,m
复制代码
这里首先设置最多只用40核,然后任务数由4开始,每次加4,一直到最大,也就是之前的40核。
-n M 的意思单个任务使用最大的核,使得把40核全部用掉,如果不能用掉。那么就忽略此设定,因此task=12,16等情形下,由于n无法取整数使得40核被完全用掉,这些设定就会被忽略,最终的设定如下图
g16/g09的测试结果:测试平台:EPYC 7742 X 2,更多信息见上面xbench的输出截图
1. 单任务情况:
测试命令:- xbench.sh -n 4,4,128 -t 1 -r 3
复制代码 从4核开始,每次增加4核,一直到12核为止(-n 4,4,12)
一次只同时跑一个任务(-t 1)
每个任务跑3次取平均值(-r 3)
结果:
结果与讨论:- 这里只显示到了64核,因为64核之后,运算速度突然不涨了,这和网上的一些结论不符。可能和测试平台或者g16的版本有关?具体原因还需进一步研究
- 这里数据会有波动(即使是三次平均的结果) ,我目前认为这是因为numa节点上非满载情况下用nprocshared导致实际使用cpu在两个socket上随机分配导致,后面会单独写个帖子介绍这个情况。后续版本也会加入numactl来避免这种情况。
- 算力=1000/(单个任务平均耗时/同时进行的任务数),使用这个指标能方便的进行单任务和多任务情况的比较,能方便的在不同的cpu之间进行比较。同时时间越短越厉害这种表述不符合传统价值观的要求——改成算力越强越厉害就没有这个毛病了。
- 图中g09default指的是积分格点和精度的设置为int(fine,acc2e=10),而g16default对应于int(ultrafine,acc2e=12),如果未单独标出则表明采用g09/g16的默认设置。
- g16如未标明指的是avx2版本。
- g16avx2版本比g09要快1.3到1.5倍。
- g16SSE版本和g09的速度相当,但是并行效率更低,这说明g16代码上可能并没有优化,只是使用了不同的指令集导致速度更快。
- g09default的设置比g16default的设置会带来1.7~2.0倍的速度提升(个人建议用int(fine,acc2e=10),节能减排)
- 据说g16的并行效率比g09高,但是本次测试表明g16的并行效率更低,除了上图可以直观的看到的g16sse版本比g09并行效率低,我另外做了速度对比图:
图中是g16avx2版本和g09在不同核心并行的情况下的的算力(速度)比值,可以看到随着并行核数的增加,g16比g09的比值在下降,这应该能说明g16的并行效率更低。另外从图中还能看到在g16default下g16比g09快的更多。
2. 多任务情况:
单任务的情况下比较并行效率实际意义有限,因为实际上不太可能只用一部分的核心做计算,而留下空闲的核心。用户面临的选择可能是有很多任务,同时核心数有限,那么每个任务分配多少核比较合理,这种情况在当前节点越来越胖的情况下会更加的显著。比如有一台48核的机器,而用户有20个任务需要计算,那么是每个任务分配24核,同时跑两个任务,还是每个任务4核,同时跑12个任务更快。
测试命令:
- xbench.sh -n 4,4,128 -t 1,1,m -r 3
复制代码 命令说明:
从4核开始,每次增加4核,一直到128核为止(-n 4,4,128)
从单任务开始,每次增加1任务,一直到最大任务为止(-t 1,1,m),最大任务=总核心数/单任务核心数
结果:
结果与讨论:
- 单个任务增加核数的并行效率低于固定单任务核心数而增加任务数的并行效率
- 其中,单个任务的核心数越少,算力越高
3. 满载算力
下图是单任务不同核数的情况下,同时运行n个任务使得体系满载时的算力,采用的是G16default
讨论:
并行效率的下降可以分解为两种,一种是系统资源被消耗(我估计主要是内存带宽)产生的效率下降,一种是程序本身算法带来的效率下降。
满载算力的比较下,系统资源消耗带来的效率下降是一样的。因此这时候能比较真实的反应程序算法带来的效率下降。
可以看到此时效率下降是基本是线性的。因此我们就能通过4核满载算力或者是8核满载算力来比较不同cpu的性能。
|
-
-
xbench.sh
23.58 KB, 下载次数 Times of downloads: 22
-
-
xbench2.sh
25.79 KB, 下载次数 Times of downloads: 22
-
-
xbench3.sh
29.78 KB, 下载次数 Times of downloads: 37
评分 Rate
-
查看全部评分 View all ratings
|