使用性能测试工具TAU测试MPI程序记录

前言

最近又重新把性能测试给捡起来了。所以决定再重新使用TAU(Tuning and Analysis Utilities )来做一些性能测试。测试的程序主要是组里一个师兄开发的基因组装程序,使用MPI+C++编写的。对于MPI的程序,当下来说最好的测试工具就是TAU了。
因为这一篇博客主要是对测试过程做一个简单的记录,所以关于TAU的安装过程、原理介绍等,大家可以在去查看相关的论文。

测试过程

1. 动态插桩(Dynamic instrumentation)

在mpirun的命令中插入一个tau_exec,实现动态插桩。
普通的MPI运行命令。后面是一系列程序运行的参数:

> mpirun -np 8 ./swap -k 19 -c 5 -i ./data/S.aureus.fasta -o Saur_k19_c5

加了tau_exec之后的运行命令:

> mpirun -np 8 tau_exec ./swap -k 19 -c 5 -i ./data/S.aureus.fasta -o Saur_k19_c5

接着目录下会多了几个类似于profile.0.0.0的文件。直接在当前目录下执行pprof命令:

> pprof

显示结果如下图所示:
在这里插入图片描述
这种方法只能够查看到MPI的函数调用情况,并不能看到用户的自定义函数的调用情况。因此不太推荐这种插桩方法。

2. 源码插桩(Source instrumentation)

直接在源码中进行插桩。
首先,要选择我们想要借助TAU获得的信息(e.g. MPI support, tracing, CUDA hardware counters, etc)。我们要将TAU_MAKEFILE变量设置为相应的pdt。因为我们现在使用TAU来测MPI程序的信息,因此将TAU_MAKEFILE变量设为tau-mpi-pdt

> export TAU_MAKEFILE=$TAU_HOME/lib/Makefile.tau-mpi-pdt

接着,使用tau_cc.sh或者tau_cxx.sh而不是使用mpicc或者mpicxx来编译cpp文件。以下代码是从别处抄来的,因为我测的这个程序使用MakeFile文件来进行编译的,我就直接在MakeFile文件中进行修改,将mpicxx替换成tau_cxx.sh

> tau_cxx.sh wave2d.cpp -o wave2d

编译完成后,还是使用mpirun运行:

> mpirun -np 4 tau_exec ./swap -k 19 -c 5 -i ./data/S.aureus.fasta -o Saur_k19_c5

接着就是使用各种可视化工具来对性能测试的数据进行可视化。pprof是一个基于文本的可视化工具。先使用pprof试试:

> pprof

在这里插入图片描述可以看出确实多了很多用户自定义函数的执行情况,而不是只限于MPI函数。但是可能是因为没有解析出来的缘故,很多函数都只是给出了地址,而没有给出函数名字。

另外一种可视化工具Paraprof,提供图形化界面。

> paraprof

在这里插入图片描述主要是显示四个节点(因为MPI执行时设定的参数就是4)上函数执行时间的情况。

3. 基于编译器的插桩(Compiler-based instrumentation)和可选择代码区域的插桩(Selective instrumentation

基于编译器的插桩介于Source和Dynamic之间。而选择代码区域的插桩大致就是在代码中指定一块区域。两个我都没怎么使用过,就不介绍了。文档中还是推荐使用源码(Source)插桩。

结尾

暂时主要就是这些内容,以后遇到新的内容我再进行更新。谢谢观看!

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: 基于位置的阻抗控制(Impedance Control)是机器人控制中常用的一种控制策略,它可以让机器人在执行任务时更加灵活和安全。下面是一个简单的基于位置的阻抗控制的 MATLAB 测试程序示例: ```matlab %% 定义机器人 robot = loadrobot('abbirb120','Gravity',[0 0 -9.81]); %% 设置控制器参数 Kp = 100; % 位置增益 Kd = 10; % 速度增益 M = 0.5; % 阻抗质量 B = 20; % 阻抗阻尼 %% 设置期望位置 pos_desired = [0.5, 0.5, 0.5]; %% 初始化机器人姿态 q0 = homeConfiguration(robot); tspan = linspace(0,5,1000); % 设置仿真时间 %% 定义阻抗控制器函数 function tau = impedance_control(q,qd,pos_desired,Kp,Kd,M,B) J = geometricJacobian(robot,q,'endeffector'); % 计算机器人雅可比矩阵 pos_current = tform2trvec(getTransform(robot,q,'endeffector')); % 获取当前位置 vel_current = J*qd'; % 获取当前速度 % 计算力 f = M*(pos_desired-pos_current)-B*vel_current; % 计算关节力 tau = J'*f'+Kp*(pos_desired-pos_current)+Kd*(zeros(1,3)-vel_current); end %% 模拟运动 [t,q,qd] = ode45(@(t,q)robot.dynamics(q,impedance_control(q,qd,pos_desired,Kp,Kd,M,B)),tspan,q0); %% 绘制机器人轨迹 figure; show(robot,q); hold on; plot3(pos_desired(1),pos_desired(2),pos_desired(3),'r*'); ``` 在上面的示例代码中,我们首先使用 `loadrobot` 函数加载了一个 ABB IRB 120 机器人模型。接着,我们定义了控制器的参数(位置增益、速度增益、阻抗质量和阻抗阻尼)和期望位置,然后初始化了机器人的姿态和仿真时间。最后,我们定义了一个阻抗控制器函数 `impedance_control`,并使用 `ode45` 函数模拟了机器人的运动轨迹,并绘制了机器人的轨迹和期望位置。 注意,在实际的机器人控制中,还需要考虑机器人的运动限制和碰撞检测等问题。此处仅提供一个简单的示例程序供参考。 ### 回答2: 基于位置的阻抗控制是一种常用的控制算法,用于机器人等系统中。下面是一个使用Matlab编写的简单的基于位置的阻抗控制程序的示例: ``` % 定义机器人模型和控制参数 M = 1.0; % 质量 B = 0.2; % 阻尼系数 K = 1.0; % 刚度系数 desired_position = 0.5; % 期望位置 % 初始化控制器的变量 position = 0.0; % 当前位置 velocity = 0.0; % 当前速度 force = 0.0; % 施加的力 % 设置仿真时间和步长 t_end = 10.0; % 仿真时间结束点 dt = 0.01; % 步长 % 进行仿真 for t=0:dt:t_end % 计算误差 error = desired_position - position; % 计算力 force = K * error - B * velocity; % 根据牛顿定律计算加速度 acceleration = force / M; % 更新速度和位置 velocity = velocity + acceleration * dt; position = position + velocity * dt; % 输出当前时间和位置 disp(['时间:', num2str(t), ' 秒,位置:', num2str(position)]); end ``` 以上程序是一个简单的基于位置的阻抗控制示例。其中,通过设定物体的质量、阻尼系数和刚度系数,以及期望位置,程序模拟了物体在阻抗控制下的运动情况。在每个时间步长内,程序计算当前误差并根据阻抗控制原理计算施加的力。根据牛顿定律计算加速度,然后更新速度和位置,最后输出当前的时间和位置。 ### 回答3: 基于位置的阻抗控制是一种常用的机器人控制方法,在实际应用中能够实现机器人与环境之间的力交互和碰撞避免。以下为一个基于位置的阻抗控制的MATLAB测试程序的伪代码: ``` % 初始化机器人参数 Kp = 10; % 位置控制增益 Kd = 5; % 位置控制微分增益 Kf = 100; % 阻抗控制增益 M = 1; % 环境质量 B = 1; % 环境阻尼 F_ext = 0; % 外力输入 q_desired = 0; % 期望位置 % 建立模型 m = 1; % 机器人质量 b = 1; % 机器人阻尼 k = 1; % 机器人刚度 % 初始化变量 q = 0; % 实际位置 q_dot = 0; % 实际速度 T = 0.01; % 控制周期 t = 0; % 时间 % 控制循环 while t < 10 % 测量实际位置和速度 q = measure_position(); q_dot = measure_velocity(); % 计算控制力 F_control = Kp * (q_desired - q) - Kd * q_dot + Kf * (q_desired - q) + F_ext; % 计算环境受力 F_env = -k * q - b * q_dot; % 计算机器人加速度 q_dot_dot = (F_control - F_env) / m; % 更新机器人位置和速度 q_dot = q_dot + q_dot_dot * T; q = q + q_dot * T; % 更新时间 t = t + T; end ``` 在该测试程序中,我们首先初始化了机器人和环境的参数,如位置控制增益、阻抗控制增益、环境质量等。然后建立了机器人和环境的模型,并初始化了相关的变量。在控制循环中,我们首先测量实际位置和速度,然后根据位置控制误差计算控制力。接着根据环境受力计算机器人加速度,并更新机器人的位置和速度。最后,更新时间并循环执行控制过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值