分析数据的用户模式显示尝试提供信息,好像程序按照OpenMP 软件执行概述中所述的直观模型实际执行一样。在计算机模式下显示的实际数据捕获运行时库 libmtsk.so(它不对应于模型)的实现详细信息。专家模式显示为匹配模型而改变的混合数据和实际数据。
在用户模式下,更改了分析数据的显示以便更好地匹配模型,在以下三个方面不同于记录的数据和机器模式显示:
从 OpenMP 运行时库的角度来看,构造的人工函数表示每个线程的状态。
处理调用栈以报告对应于代码运行方式模型的数据,如上所述。
为基于时钟的分析实验构造另外两个性能度量,它们分别对应于执行有用工作所用的时间和在 OpenMP 运行时中等待所用的时间。度量为“OpenMP 工作”和“OpenMP 等待”。
对于 OpenMP 3.0 程序,又构造了一个度量“OpenMP 开销”。
构造人工函数,并将其放置在用户模式和专家模式调用堆栈上,以反映线程在 OpenMP 运行时库中处于某个状态的事件。
定义了以下人工函数:
<OMP-overhead> |
在 OpenMP 库中执行 |
<OMP-idle> |
从属线程,等待工作 |
<OMP-reduction> |
执行归约操作的线程 |
<OMP-implicit_barrier> |
在隐式屏障处等待的线程 |
<OMP-explicit_barrier> |
在显式屏障处等待的线程 |
<OMP-lock_wait> |
等待锁定的线程 |
<OMP-critical_section_wait> |
等待进入临界段的线程 |
<OMP-ordered_section_wait> |
等待轮流进入排序段的线程 |
<OMP-atomic_section_wait> |
等待 OpenMP 原子构造的线程。 |
当线程处于对应于其中一个人工函数的 OpenMP 运行时状态时,会将该人工函数作为堆栈上的叶函数添加。当线程的实际叶函数处于 OpenMP 运行时中的任意位置时,<OMP-overhead> 将作为叶函数替换它。否则,从用户模式堆栈中忽略 OpenMP 运行时中的所有 PC。
对于 OpenMP 3.0 程序,不使用 <OMP-overhead> 人工函数。由“OpenMP 开销”度量替换人工函数。
对于 OpenMP 实验,用户模式显示重构的调用堆栈,这些重构的调用堆栈类似于在不使用 OpenMP 的情况下编译程序时获取的调用堆栈。目的在于以与程序的直观了解相匹配的方式提供分析数据,而不是显示实际处理的所有详细信息。当 OpenMP 运行时库正在执行某些特定操作时,协调主线程和从属线程的调用堆栈,并将人工 <OMP-*> 函数添加到调用堆栈。