Oracle® Solaris Studio 12.4:性能分析器教程

退出打印视图

更新时间: 2014 年 12 月
 
 

检测伪共享

教程的此部分仅适用于 L1 数据高速缓存未命中 dcm 计数器精确的系统。这样的系统包括 SPARC-T4、SPARC-T5、SPARC-M5 和 SPARC-M6 等。如果您的实验是在没有精确 dcm 计数器的系统上记录的,则本节不适用。

以下过程说明如何使用索引对象视图和内存对象视图以及过滤功能。

在具有精确的内存相关计数器的系统上创建实验时,会在实验中记录计算机模型。计算机模型表示地址到该计算机的内存子系统中各种组件的映射。在性能分析器或 er_print 中装入实验时,会自动装入计算机模型。

用于本教程中屏幕抓图的实验记录在 SPARC T5 系统上,该计算机的 t5 计算机模型随实验自动装入。计算机模型将添加索引对象和内存对象的数据视图。

  1. 转到 "Functions"(函数)视图并选择 computeB(),然后右键单击并选择 "Add Filter: Include only stacks containing the selected functions"(添加过滤器:仅包括含有所选函数的堆栈)。

    通过过滤,可以将注意力集中于 computeB() 函数的性能和在该函数中发生的分析事件。

  2. 单击工具栏中的 "Settings"(设置)按钮,或者选择 "Tools"(工具)> "Settings"(设置)打开 "Settings"(设置)对话框,然后在该对话框中选择 "Views"(视图)标签。

    image:性能分析器中针对不同视图的设置

    右侧的面板标记有 "Memory Objects Views"(内存对象视图),并显示一个表示 SPARC T5 计算机的内存子系统结构的数据视图的长列表。

  3. 选中 "Vaddress" 和 "Vline_32B" 的复选框,然后单击 "OK"(确定)。

  4. 在 "Views"(视图)导航面板中选择 "Vaddress" 视图。

    image:包含 L1 数据高速缓存未命中次数的 “Vaddress“ 视图

    在此实验中,可以看到存在四个获取高速缓存未命中次数的不同地址。

  5. 选择其中一个地址,然后右键单击并选择 "Add Filter: Include only events with the selected item"(添加过滤器:仅包括含有所选项的事件)。

  6. 选择 "Threads"(线程)视图。

    image:“Vaddress“ 视图

    正如在之前的屏幕抓图中所见,只有一个线程具有该地址的高速缓存未命中次数。

  7. 通过在视图中右键单击并从上下文菜单中选择 "Undo Filter Action"(撤消过滤器操作),删除地址过滤器。

    也可以使用 "Active Filters"(活动过滤器)面板中的 "Undo Filter Action"(撤消过滤器操作)删除过滤器。

  8. 返回到 "Vaddress" 视图,选择并过滤其他地址,然后检查 "Threads"(线程)视图中的关联线程。

    通过过滤和取消过滤,以及通过此方式在 "Vaddress" 和 "Threads"(线程)视图之间切换,可以确认在四个线程和四个地址之间存在一对一关系。即,四个线程不共享地址。

  9. 在 "Views"(视图)导航面板中选择 "Vline_32B" 视图。

    image:“Vaddress“ 视图

    在 "Active Filters"(活动过滤器)面板中,确认只有该过滤器在函数 computerB() 上处于活动状态。该过滤器将显示为 "Functions: Selected Functions"(函数:所选函数)。现在地址上应该没有过滤器处于活动状态。

    您应该看到,有两个 32 字节高速缓存行获取四个线程及其四个相应地址的高速缓存未命中次数。这确认了以下情况:虽然之前您看到四个线程不共享地址,但是在此处看到它们确实共享高速缓存行。

伪共享是一个诊断起来非常困难的问题,通过 SPARC T5 芯片以及 Oracle Solaris Studio 性能分析器则可以进行诊断。