需要注意的是,事件组中的原生事件个数不能够超过处理器所能 支持的硬件性能计数器个数。
与高层接口相比,PAPI 底层接口的使用更加灵活,能够对处理器事 件进行更全面的监测。因此,本文的主要内容是探讨如何利用 PAPI 底层接口监测和采集 Java 程序的硬 件执行特征。
利用PAPI接口监测Java程序的硬件执行特征(2)
时间:2011-10-02 ibm 王峰
常用的 PAPI 底层接口
当前的 PAPI 实现有 C 语言和 Fortran 语言两个版 本。本文以 C 语言版本为例,在表 1 中列出了用户在对程序运行时产生的事件进行监测时常用的底层接 口。
表 1. 常用的 PAPI 底层接口
PAPI 底层接口 |
接口功能简 述 |
PAPI_library_init |
初始化 PAPI 接口库 |
PAPI_create_eventset |
创建事件组 |
PAPI_add_event / PAPI_add_events |
向事件组中添加原生事件或者 PAPI 预制事件 |
PAPI_remove_event / PAPI_remove_events |
从事件组中删除事件 |
PAPI_start |
启动计数器对事件组的计数 |
PAPI_read |
读取计数器数值 |
PAPI_stop |
停止计 数器计数并读取当前的计数器数值 |
PAPI_cleanup_eventset |
清除事件组中的 事件 |
PAPI_destroy_eventset |
销毁事件组 |
PAPI_shutdown |
终止使用 PAPI 并释放所有相关资源 |
清单 1 给出的代码片段简要地示意了利用 PAPI 接口监测程序的硬件执行特 征的工作流程,该代码片段利用了表 1 中所列的常用的 PAPI 底层接口。
清单 1. 利用 PAPI 接 口监测程序的硬件执行特征
#include <papi.h>
#include <stdio.h>
main() {
int EventSet;
long_long values[1], values1[1], values2[1];
/* Initialize the PAPI library */
if (PAPI_library_init(PAPI_VER_CURRENT) != PAPI_VER_CURRENT)
handle_error();
/* Create an EventSet */
EventSet = PAPI_NULL;
if (PAPI_create_eventset(&EventSet) != PAPI_OK)
handle_error();
/* Add an event about Total Instructions Executed (PAPI_TOT_INS) to EventSet */
if (PAPI_add_event(EventSet, PAPI_TOT_INS) != PAPI_OK)
handle_error();
/* Start counting events */
if (PAPI_start(EventSet) != PAPI_OK)
handle_error();
/* Read counters before workload running*/
if (PAPI_read(EventSet, values1) != PAPI_OK)
handle_error();
/* Do some computation here */
/* Stop counting events */
if (PAPI_stop(EventSet, values2) != PAPI_OK)
handle_error();
/* Get value */
values[0] = values2[0] – values1[0];
/* Clean up EventSet */
if (PAPI_cleanup_eventset(EventSet) != PAPI_OK)
handle_error();
/* Destroy the EventSet */
if (PAPI_destroy_eventset (&EventSet) != PAPI_OK)
handle_error();
/* Shutdown PAPI */
PAPI_shutdown();
}
|