开始使用英特尔跟踪分析器和收集器
开始使用英特尔® 跟踪分析器和收集器
使用此入门文档和预先收集的跟踪 file 使用英特尔® 跟踪分析器和收集器完成基本的 MPI 性能分析。
英特尔跟踪分析器和收集器有助于探索消息传递接口 (MPI) 使用效率并识别通信热点、同步瓶颈和负载平衡。 有关该产品的更多信息,请参阅英特尔跟踪分析器和收集器产品页面。
下载英特尔跟踪分析器和收集器
- 作为英特尔® oneAPI HPC 工具包的一部分
- 作为一个独立的工具
先决条件
- 在运行英特尔跟踪分析器和收集器之前,确保您已经安装了最新的英特尔® MPI 库和英特尔® oneAPI DPC++/C++ 编译器或英特尔® Fortran 编译器。
- 这将为编译器、英特尔 MPI 库和英特尔跟踪分析器和收集器设置所需的环境变量,您就可以跟踪您的应用程序了。
- 如需了解更多信息,请参阅:英特尔® oneAPI HPC 工具包系统要求。
了解工作流程
- 追踪您的申请
- 分析最活跃的 MPI 函数
- 识别有问题的交互
- 通过替换导致问题的功能来提高您的应用程序性能
跟踪您的 MPI 应用程序
生成跟踪 file 收集事件日志,用于后续的应用行为分析。
- 通过从 oneAPI 安装目录运行 setvars 脚本,设置用于启动英特尔® 跟踪分析器和收集器的环境
笔记
默认情况下,英特尔跟踪分析器和收集器安装到 /opt/intel/oneapi/itac for Linux* OS 和 Program Files (x86)\Intel\oneAPI\itac\latest for Windows* 操作系统。
在 Linux 上:
$ 源 /opt/intel/oneapi/setvars.sh
在 Windows 上:
“C:\Program Files (x86)\Intel\oneAPI\setvars.bat” - 运行 MPI 应用程序并使用 -trace 选项生成跟踪。
在 Linux 上:
$ mpirun -trace -n 4 ./poisson_sendrecv.single
在 Windows 上:
编译应用程序并收集跟踪。
对于英特尔 oneAPI DPC++/C++ 编译器,运行:
> mpiicc-trace poisson_sendrecv.single.c
对于英特尔 Fortran 编译器,运行:
> mpiifort-trace poisson_sendrecv.single.f
这个前任ample 为 as 生成跟踪 (stf*)ample poisson_sendrcv.single MPI 应用程序 - 打开生成的.stf file 使用带有英特尔跟踪分析器和收集器的英特尔跟踪分析器。
在 Linux 上:
$ 跟踪分析器 ./ poisson_sendrecv.single.stf
在 Windows 上:
跟踪分析器 poisson_sendrecv.single.stf
笔记
出于测试目的,您可以下载预先收集的跟踪 file poisson_sendrecv.single.stf 用于本文档中使用的泊松,并使用 Intel Trace Analyzer and Collector 打开它。
.stf file 在摘要页面中打开 view,代表有关您的应用程序性能的一般信息:笔记 有关英特尔跟踪分析器和收集器功能的更多信息,请参阅了解更多。
分析最活跃的 MPI 函数
分析 MPI 应用程序行为,找到瓶颈并识别序列化,以找到提高应用程序性能的方法。
- 从摘要页面打开事件时间线 view 单击继续 > 图表 > 事件时间线以深入分析顶级 MPI 函数。
该图表显示了一段时间内的各个流程活动。
应用程序工作是迭代的,其中每次迭代都包含计算部分和 MPI 通信。 - 通过在所需的时间间隔上拖动鼠标来确定要关注并放大的单个迭代:
痕迹 view 显示您选择的轨迹中的部分。 事件时间线图表显示在选定迭代期间处于活动状态的事件。
- 水平条表示进程以及在这些进程中调用的函数。
- 黑线表示进程之间发送的消息。 这些线连接发送和接收进程。
- 蓝线代表集体操作,例如广播或减少操作。
- 切换到 Flat Profile 选项卡 (A) 可以更仔细地查看在您(在事件时间轴中选择的时间点)执行的功能。
- 取消对 MPI 函数的分组以分析应用程序中的 MPI 进程活动。
为此,请右键单击 Flat Pro 中的所有进程 > 组 MPI (B)file 并选择 UngroupMPI。 此操作公开了各个 MPI 调用。 - 在迭代开始时使用 MPI_Sendrecv 分析与其直接邻居通信的进程。 对于前amp乐:
- A。 在年代amp例如,MPI_Sendrecv 数据交换有一个瓶颈:在与前一个进程的交换完成之前,该进程不会与它的下一个邻居交换数据。 事件时间表 view 将此瓶颈显示为楼梯。
- b. 迭代结束时的 MPI_Allreduce 重新同步所有进程; 这就是为什么这个街区有反向楼梯的外观。
- 使用 Function Pro 识别序列化file 和消息临file views.
- A。 同时打开图表:
在功能临file 图表,打开负载平衡选项卡。 - 转到图表菜单以打开 Message Profile.
- b. 在负载平衡选项卡中,展开 MPI_Sendrecv 和 MPI_Allreduce。 Load Balancing表明随着进程数的增加,MPI_Sendrecv耗时增加,而MPI_Allreduce耗时减少。
- C。 检查 Message Profile 图表向下到右下角。
块的颜色编码表明消息从较高级别传输到较低级别需要按比例增加时间,而消息从较低级别传输到较高级别显示出一种弱奇偶模式:
- A。 同时打开图表:
比较分析的结果表明,应用程序中没有复杂的交换模式,仅与相邻进程进行交换。 这些信息对于通过更改通信步骤优化应用程序的通信模型来提高应用程序性能至关重要。
识别不平衡的沟通
在理想情况下观察您的应用并比较原始迹线 file 与理想化的人隔离有问题的互动。
- 创造理想化 file:
- A。 选择高级 > 理想化或单击
(理想化)工具栏按钮。
- b. 检查 Idealization 对话框中的理想化参数(ideal trace file 转换的名称和时间范围)。
- C。 单击开始以理想化您的轨迹。
- A。 选择高级 > 理想化或单击
- 将原始迹线与理想化迹线进行比较:
- A。 选择 Advanced > Imbalance Diagram 或单击
(不平衡图)工具栏按钮。
- b. 在不平衡图对话框中,单击打开另一个 File 按钮,导航到理想化迹线,然后选择它。
- C。 在 Imbalance Diagram 窗口中,单击 Total Mode 按钮并选择 Breakdown Mode。
- A。 选择 Advanced > Imbalance Diagram 或单击
可以看到 MPI_Sendrecv 是最耗时的函数。 不平衡重量显示在
浅色,约占 MPI_Sendrecv 函数的 10%。 这是进程相互等待的时间。
通过改变通信方式提高您的应用程序性能
- 通过将阻塞通信更改为非阻塞通信来提高 MPI 应用程序的性能。
在您的代码中,将串行 MPI_Sendrcv 替换为非阻塞通信:MPI_Isend 和 MPI_Irecv。 对于前ample:原始代码片段:
//边界交换
无效交换(para* p, grid* gr){
int i,j;
MPI_状态状态_100、状态_200、状态_300、状态_400;
// 向下发送第一行
MPI_Send(gr->x_new[1], gr->lcol+2, MPI_DOUBLE, gr->down, 100, MPI_COMM_WORLD); MPI_Recv(gr->x_new[gr->lrow+1], gr->lcol+2, MPI_DOUBLE, gr->up, 100, MPI_COMM_WORLD,
&status_100);
// 发送最后一行
MPI_Send(gr->x_new[gr->lrow], gr->lcol+2, MPI_DOUBLE, gr->up, 200, MPI_COMM_WORLD);
MPI_Recv(gr->x_new[0], gr->lcol+2, MPI_DOUBLE, gr->down, 200, MPI_COMM_WORLD, &status_200);
使用英特尔跟踪分析器比较 view 将序列化应用程序与修改后的应用程序进行比较
// 将左列复制到 tmp 数组
如果(gr->左!= MPI_PROC_NULL){
gr->x_new[i][gr->lcol+1] = right_col[i]; right_col[i] = gr->x_new[i][gr->lcol];
// 向右发送
MPI_Send(right_col, gr->lrow+2, MPI_DOUBLE, gr->right, 400, MPI_COMM_WORLD); }
如果(gr->左!= MPI_PROC_NULL)
{
MPI_Recv(left_col, gr->lrow+2, MPI_DOUBLE, gr->left, 400, MPI_COMM_WORLD,&status_400); for(i=0; i< gr->lrow+2; i++
{
gr->x_new[i][0] = left_col[i];
}
}
更新的代码片段
MPI_Request 请求[7];
// 向下发送第一行
MPI_Isend(gr->x_new[1], gr->lcol+2, MPI_DOUBLE, gr->down, 100, MPI_COMM_WORLD, &req[0]);
MPI_Irecv(gr->x_new[gr->lrow+1], gr->lcol+2, MPI_DOUBLE, gr->up, 100, MPI_COMM_WORLD, &req[1]);
…..
MPI_Waitall(7, 请求, MPI_STATUSES_IGNORE);
更正后,修改后的应用程序的单次迭代将如下所示amp乐: - 使用英特尔跟踪分析器比较 view 将序列化申请与修改后的申请进行比较。 在 Comparison 的帮助下比较两条轨迹 View,去 View > 比较。 比较 View 看起来类似于:
在比较 View,您可以看到使用非阻塞通信有助于消除序列化并减少进程通信的时间。
笔记 有关应用程序节点级性能的更多信息,请参阅相应工具的文档:英特尔® VTune™ Profiler MPI 代码分析和使用英特尔® Advisor 分析英特尔® MPI 应用程序。
了解更多
探索以下资源,了解有关英特尔跟踪分析器和收集器的更多信息。
声明和免责声明
- 英特尔技术可能需要启用硬件,软件或服务才能激活。
- 没有任何产品或组件是绝对安全的。
- 您的费用和结果可能会有所不同。
- © 英特尔公司。 英特尔、英特尔标识和其他英特尔标志是英特尔公司或其子公司的商标。 其他名称和品牌可能是其他人的财产。
- 本文件不授予任何知识产权许可(无论是明示的、暗示的、禁止反言的还是其他方式)。
- 所述产品可能包含设计缺陷或错误(称为勘误表),这可能导致产品与已发布的规格不符。最新勘误表可应要求提供。
- 英特尔否认所有明示和默示保证,包括但不限于适销性、特定用途适用性和不侵权的默示保证,以及因履行过程、交易过程或贸易使用产生的任何保证。
文件/资源
![]() |
英特尔 开始使用英特尔跟踪分析器和收集器 [pdf] 用户指南 英特尔跟踪分析器和收集器入门, 英特尔跟踪分析器和收集器入门, 收集器 |