什么是DMSA?
在PT中,我们将一种operating mode(如FUNC、DFT等)和一种operating condition(如WC、WCZ、AVS等)的组合称成为scenario,显然【scenarios = modes * conditions】。
PT为了节省时间,支持并行地对这些scenarios进行分析。
这些scenarios通过ssh、lsf等工具被提交到不同的host上进行计算(支持多种通信工具同时工作),因此这种技术被称为Distributed Multi-Scenario Analysis(DMSA)。
在计算过程中,由master process控制其它的worker processes,可以简单地认为在每个work_process上对应着一种scenario的分析,PT通过这种并行分析节省了总时间。
DMSA模式通过-multi_scenario选项启动,或者将multi_scenario_enable_analysis变量设置为true。
pt_shell -multi_scenario
scenario、session和command focus的关系
scenario的创建由命令create_scenario完成,PT支持两种创建方式。
使用-common_data和-specific_data来创建scenario:
-common_data中指定的是多个scenarios共享的数据,-specific_data中指定的是当前创建的scenario特有的数据。
与之对应的还有-common_variables和-specific_data用于指定变量。
整个创建的过程类似于我们PT在单场景分析模式下创建一个新的session。
使用-image读取保存的session来创建scenario:
这里使用的session可以是PT在单场景分析模式下保存的session,也可以是DMSA模式下保存的session。该命令和restore_session比较类似,只不过这里的一个session会被当作一种scenario来进行分析。
显然,我们可以由多条create_scenario命令来创建多种scenarios。为了便于管理,PT又定义了current_session和current_scenario两条命令,这两条命令提供了更精细化的选择和控制。
current_scenario是current_session的子集,只有被current_scenario选中的scenarios,才能被我们的命令所影响(remote_execute,后面会详细介绍)。
所幸的是我们一般不用同时指定current_session和current_scenario,因为默认状态下,current_session下所有的scenario都是选中(focus)的状态,所以我们只需要指定current_session就行了。
set_host_options命令
由于DMSA是一种分布式的计算方式,所以我们需要通过set_host_options命令来指定我们需要的计算资源。
下图是set_host_options的一个简单例子,如果你有很多不同类型的计算资源,显然可以多次调用set_host_options来设定你准备使用的计算资源。
需要注意的是,我们会给每个scenario分配一个process(real or virtual)来进行计算。
-local_process: 用于指定local_host上的计算资源。
-num_processes number: 用于指定有多少processes使用当前的host_option设定。
-max_cores number: 用于指定每个process上最多使用的core。
-protocol auto | custom | lsf | netbatch | pbs | rsh | rtda | sge | sh | ssh: 用于指定local host和远程计算资源之间通信的协议,选好后还需要指定提交job和kill job的命令,这里就不展开说明了。
-load_factor number: 用于指定每个real process可以展开成多少个process(real+virtual)。该选项的意义有两点,一是如果你的计算集群上的机器小于scenerio,可以让一台机器计算多个scenarios;二是同一台机器上的scenarios的计算交互是基于内存的,因此可以减少数据交互的时间。
还有很多其它选项,详细的说明可以参考用户手册,上面的例子还是很详细的:
redirect set_host_options.man {man set_host_options}
sh gvim set_host_options.man &
在指定好计算资源后,我们可以使用report_host_usage来查询host_option的设置。检查OK后,通过start_hosts命令让hosts上线(online)。
report_host_usage
start_hosts
remote_execute命令
为了能让部分或者全部的scenarios执行我们的命令,我们首先使用current_session和current_scenario两条命令将对应的scenarios选中(focus)。然后将需要执行的命令放在remote_execute语句内,remote_execute语句支持两种类型的远程执行。
基于remote上下文的remote_execute(花括号),也就是说变量的值基于remote worker环境
remote_execute {
# variable all_in evaluated at worker
report_timing -from $all_in -to [all_outputs]
}
基于master上下文的remote_execute(双引号),也就是说变量的值基于master环境
remote_execute "
# variable all_out evaluated at master
report_timing -to $all_out
"
由于这种远程执行是针对于每个被选中的scenario,所以每个scenario都会产生对应的报告。
PT同样支持基于这些被选中的scenarios产生一个总的merged的报告,此时只需要将命令放在remote_execute外执行即可。
以下的命令支持产生merged的报告。
再补充一张user guide中的流程图帮助加深理解。
Working Directory
Working Directory 指定了 DMSA 各个 scenario 的工作目录。通常在这个目录下,会自动以 scenario 的名字建立各个 scenario slave process 运行的子目录。
下面的命令就是在启动目录下指定一个子目录 work (自动建立) 做为工作目录。
Launch Directory of Remote Slave Process
各个 scenario 运行时都以这个子目录(如 ./work/func_wcl_cmax)为当前目录,所以如果在 slave 的脚本中有相对目录结构 ( relative directory structure )的使用,一定要以这个目录为基准目录进行命令的书写。
当然有些同学为了方便,使用绝对路径(absolute directory path)也是可以的,不过这是以丧失灵活性为代价的。
write_changes
有些 PT 命令是和目录有紧密联系的。例如这节标题提到的 write_changes,在旧版本中只支持下面的命令格式,这个命令会在每个slave process(scenario)的目录里都写出一个 pt_eco_change.tcl,一模一样的若干份,看着一点都不绿色环保。
在 PrimeTime Version P-2019.03 中 write_changes 引入了一些变化。
这样
pt_eco_change_master.tcl 只会在 Master Process 的启动目录里写出来一份,看着就不那么浪费了。