Oracle® Solaris Studio 12.4:性能分析器

退出打印视图

更新时间: 2015 年 1 月
 
 

硬件计数器分析数据

硬件计数器可跟踪诸如高速缓存未命中次数、高速缓存停止周期、浮点运算、分支误预测、CPU 周期以及执行指令之类的事件。在硬件计数器分析中,当运行线程的 CPU 的指定硬件计数器发生溢出时,收集器将记录一个分析数据包。 计数器将重置并继续进行计数。分析数据包中包括溢出值和计数器类型。

各种处理器芯片系列支持同时存在二到十八个硬件计数器寄存器。收集器可收集一个或多个寄存器上的数据。对于每个寄存器,可以选择监视溢出的计数器的类型,并为计数器设置溢出值。 有些硬件计数器可以使用任意寄存器,而有些计数器仅可以使用特定的寄存器。因此,在一个实验中并非可以选择所有的硬件计数器组合。

硬件计数器分析还可以在内核上执行:通过性能分析器和 er_kernel 实用程序执行。有关更多信息,请参见Chapter 9, 内核分析

硬件计数器分析数据由性能分析器转换为计数度量。对于以循环方式计数的计数器,所报告的度量会转换为次数;而对于不以循环方式计数的计数器,所报告的度量为事件计数。在具有多个 CPU 的计算机上,用于转换度量的时钟频率为各个 CPU 时钟频率的调和平均数。因为每种类型的处理器都有其自己的一组硬件计数器,并且硬件计数器的数目庞大,因此,此处未列出硬件计数器的度量。硬件计数器列表 讲述如何找出可用的硬件计数器。

如果收集两个特定的计数器 "cycles" 和 "insts",则可以使用两个额外的度量,即 "CPI" 和 "IPC",分别表示每指令周期数和每周期指令数。它们始终以比率(而非时间、计数或百分比)的形式显示。高 CPI 值或低 IPC 值指示代码在计算机中运行效率低;相反,低 CPI 值或高 IPC 值指示代码在管道中运行效率高。

硬件计数器的一个用途是可诊断进出 CPU 的信息流问题。例如,高速缓存未命中次数计数较高表明,重新组织程序的结构来改进数据或文本的位置或提高高速缓存的重用率可以改善程序性能。

某些硬件计数器与其他计数器相互关联。例如,分支误预测和指令高速缓存未命中次数通常是相关的,因为分支误预测会导致将错误的指令装入到指令高速缓存中。这些指令必须替换为正确的指令。这种替换会导致指令高速缓存未命中,或指令转换后备缓冲器 (instruction translation lookaside buffer, ITLB) 未命中,或甚至缺页。

对于许多硬件计数器,经常会用导致溢出事件的指令之后的一条或多条指令报告溢出。这种情况称为“失控”(skid),它会使计数器溢出分析数据难以解释。

在最新的 SPARC 处理器上,某些基于内存的计数器中断是精确的,并使用 PC(program counter,程序计数器)和触发事件的有效地址来报告。 此类计数器的事件类型后面用字 precise 表示。缺省情况下将捕获这些计数器的内存空间和数据空间数据。有关更多信息,请参见数据空间分析和内存空间分析

硬件计数器列表

由于硬件计数器是特定于处理器的,因此可以选用的计数器取决于所使用的处理器。性能工具为许多可能常用的计数器提供了别名。 您可以确定用于分析当前计算机的最大硬件计数器定义数量,并在当前计算机上运行不带任何其他参数的 collect -h,以查看可用硬件计数器及缺省计数器集的完整列表。

如果处理器和系统支持硬件计数器分析,则 collect -h 命令会输出两个包含有关硬件计数器信息的列表。第一个列表包含硬件计数器别名(这些别名是常用名称)。第二个列表包含原始硬件计数器。如果性能计数器子系统和 collect 命令都没有特定系统上的计数器的名称,则这些列表将为空。但是,在大多数情况下,可以用数值指定计数器。

以下示例显示计数器列表中的条目。有别名的计数器将首先显示在列表中,然后是原始硬件计数器列表。该示例中的每一行输出都按打印格式显示。

Aliased HW counters available for profiling:
    cycles[/{0|1|2|3}],<interval> (`CPU Cycles', alias for Cycles_user; CPU-cycles)
    insts[/{0|1|2|3}],<interval> (`Instructions Executed', alias for Instr_all; events)
    loads[/{0|1|2|3}],<interval> 
     (`Load Instructions', alias for Instr_ld; precise load-store events)
    stores[/{0|1|2|3}],<interval> 
     (`Store Instructions', alias for Instr_st; precise load-store events)
    dcm[/{0|1|2|3}],<interval> 
     (`L1 D-cache Misses', alias for DC_miss_nospec; precise load-store events)
    l2l3dh[/{0|1|2|3}],<interval> 
     (`L2 or L3 D-cache Hits', alias for DC_miss_L2_L3_hit_nospec; precise load-store events)
    l3m[/{0|1|2|3}],<interval> 
     (`L3 D-cache Misses', alias for DC_miss_remote_L3_hit_nospec~emask=0x6; precise load-store events)
    l3m_spec[/{0|1|2|3}],<interval> 
     (`L3 D-cache Misses incl. Speculative', alias for DC_miss_remote_L3_hit~emask=0x6; events)
.
.
.
 Raw HW counters available for profiling:
    Sel_pipe_drain_cycles[/{0|1|2|3}],<interval> (CPU-cycles)
    Sel_0_wait[/{0|1|2|3}],<interval> (CPU-cycles)
    Sel_0_ready[/{0|1|2|3}],<interval> (CPU-cycles)
    Sel_1[/{0|1|2|3}],<interval> (CPU-cycles)
    Sel_2[/{0|1|2|3}],<interval> (CPU-cycles)
    Pick_0[/{0|1|2|3}],<interval> (CPU-cycles)
    Pick_1[/{0|1|2|3}],<interval> (CPU-cycles)
    Pick_2[/{0|1|2|3}],<interval> (CPU-cycles)
    Pick_3[/{0|1|2|3}],<interval> (CPU-cycles)
    Pick_any[/{0|1|2|3}],<interval> (CPU-cycles)
    Branches[/{0|1|2|3}],<interval> (events)
    Instr_FGU_crypto[/{0|1|2|3}],<interval> (events)
    Instr_ld[/{0|1|2|3}],<interval> (precise load-store events)
    Instr_st[/{0|1|2|3}],<interval> (precise load-store events)
有别名的硬件计数器列表的格式

在有别名的硬件计数器列表中,第一个字段(例如,cycles)提供可以在 collect 命令的 -h counter... 参数中使用的别名。此别名还是在 er_print 命令中使用的标识符。

第二个字段列出计数器的可用寄存器。例如,[/{0|1|2|3}]

第三个字段 <interval> 可指定为 onhilow,或数值。如果指定为 onhilow,并且事件到达过快,速率将下降。

第四个字段(在圆括号中)包含类型信息。它提供简短描述(例如 CPU Cycles)、原始硬件计数器名称(例如 Cycles_user)以及计数单位类型(例如 CPU-cycles)。

    类型信息字段中的可能条目包括下列项:

  • precise-当指令导致事件计数器溢出时,计数器发生精确中断。缺省情况下,精确计数器的 collect -h 命令收集内存空间和数据空间数据。有关详细信息,请参见"DataObjects"(数据对象)视图"DataLayout"(数据布局)视图"MemoryObjects"(内存对象)视图

  • loadstoreload-store,表明计数器与内存相关。

  • not-program-related,计数器会捕获由其他某个程序启动的事件,例如 CPU 到 CPU 的高速缓存嗅探。使用计数器进行分析时将生成警告,并且分析不记录调用堆栈。

    如果类型信息的最后一个单词或仅有的单词是:

  • CPU-cycles,则计数器可用于提供基于时间的度量。针对此类计数器报告的度量在缺省情况下会转换为独占时间和非独占时间,但是也可以显示为事件计数。

  • events,则度量是非独占和独占事件计数,且无法转换为时间。

在示例中有别名的硬件计数器列表中,第一个计数器的类型信息包含单词 CPU-cycles,第二个计数器的类型信息包含单词 events。类型信息包括两个单词的,如第三个计数器的 load-store events

原始硬件计数器列表的格式

原始硬件计数器列表中包含的信息是有别名的硬件计数器列表中信息的子集。 原始硬件计数器列表中的每行包括由 cputrack(1) 使用的内部计数器名称、可以在其上使用计数器的寄存器编号、缺省溢出值、类型信息和计数器单位(可以是 CPU-cyclesevents)。

如果计数器度量与运行的程序无关的事件,则类型信息的第一个单词是 not-program-related。对于这样的计数器,分析不会记录调用堆栈,而是显示人工函数 collector_not_program_related 中所用的时间。会记录线程 ID 和 LWP ID,但没有任何意义。

原始计数器的缺省溢出值为 1000003。对于大多数原始计数器来说,此值并非理想值,所以您应在指定原始计数器时指定溢出值。