我想使用 C 语言中的 PAPI api 分析我的应用程序的系统性能。一般结构是
-- 初始化 PAPI
-- 初始化感兴趣的
计数器 -- 启动计数器
-- 运行应用程序的主要逻辑
-- 结束计数器并读取值
我想每隔 1 秒定期读取一次计数器,而不是在应用程序结束时读取最终值。PAPI 输出是否给出程序执行结束时的聚合值,例如程序执行后 L2 缓存未命中的总数。另一个例子是在每个时间实例读取指令数,而不是程序结束时的指令总数。
我想使用 C 语言中的 PAPI api 分析我的应用程序的系统性能。一般结构是
-- 初始化 PAPI
-- 初始化感兴趣的
计数器 -- 启动计数器
-- 运行应用程序的主要逻辑
-- 结束计数器并读取值
我想每隔 1 秒定期读取一次计数器,而不是在应用程序结束时读取最终值。PAPI 输出是否给出程序执行结束时的聚合值,例如程序执行后 L2 缓存未命中的总数。另一个例子是在每个时间实例读取指令数,而不是程序结束时的指令总数。
你对此有什么想法吗?我也在做同样的事情,但我得到了奇怪的结果:我的计数器没有像我希望的那样经常更新。
作为记录,这是我测试过并且运行良好的示例:
#include <papi.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
int retval, EventSet = PAPI_NULL;
long_long values[3];
unsigned counter;
unsigned c;
unsigned long fact;
unsigned stoppoint;
/* Initialize the PAPI library */
retval = PAPI_library_init(PAPI_VER_CURRENT);
if (retval != PAPI_VER_CURRENT) {
fprintf(stderr, "PAPI library init error!\n");
exit(1);
}
/* Create the Event Set */
if (PAPI_create_eventset(&EventSet) != PAPI_OK)
printf ("%s:%d\t ERROR\n", __FILE__, __LINE__);
/* Add Total Instructions Executed to our EventSet */
if (PAPI_add_event(EventSet, PAPI_TOT_INS) != PAPI_OK)
printf ("%s:%d\t ERROR\n", __FILE__, __LINE__);
/* Add Total Instructions Executed to our EventSet */
if (PAPI_add_event(EventSet, PAPI_TOT_CYC) != PAPI_OK)
printf ("%s:%d\t ERROR\n", __FILE__, __LINE__);
/* Add Total Instructions Executed to our EventSet */
if (PAPI_add_event(EventSet, PAPI_LST_INS) != PAPI_OK)
printf ("%s:%d\t ERROR\n", __FILE__, __LINE__);
srand ( time(NULL) );
stoppoint = 50+(rand() % 100);
/* Do some computation here */
for (counter = 0; counter < stoppoint; counter++)
{
/* Initialize the PAPI library */
retval = PAPI_library_init(PAPI_VER_CURRENT);
if (retval != PAPI_VER_CURRENT) {
fprintf(stderr, "PAPI library init error!\n");
exit(1);
}
/* Start counting */
if (PAPI_start(EventSet) != PAPI_OK)
printf ("%s:%d\t ERROR\n", __FILE__, __LINE__);
fact = 1;
for (c = 1; c <= counter; c++)
{
fact = c * c;
}
printf("Factorial of %d is %lu\n", counter, fact);
if (PAPI_read(EventSet, values) != PAPI_OK)
printf ("%s:%d\t ERROR\n", __FILE__, __LINE__);
printf ("\nTotal Instructions Completed:\t%lld\t Total Cycles:\t%lld\tLoad Store Instructions\t%lld\n\n", values[0], values[1], values[2]);
/* Do some computation here */
if (PAPI_stop(EventSet, values) != PAPI_OK)
printf ("%s:%d\t ERROR\n", __FILE__, __LINE__);
}
/* End of computation */
}