在不同的函数中调用PAPI_start()和PAPI_stop()?

时间:2014-05-19 16:33:42

标签: c papi

通常PAPI的使用方式如下:

Initialize Lib
Add Event(s)
PAPI_start()
someCalculation()
PAPI_stop()

但是,我有一个应用程序,其代码如下:

start = time()
someCalculation()
t = time() - start;

我想覆盖此time()函数,该函数位于另一个文件中。我的代码:

static int INIT=0;
int retval;
static int eventSet = PAPI_NULL;
long long res[1];

if(INIT){
        // eventSet is NOT PAPI_NULL here!
        if ((retval = PAPI_stop(eventSet, res)) != PAPI_OK)
                handle_error(retval);
        return res[0]/1e9;
}

INIT = 1;
retval = PAPI_library_init(PAPI_VER_CURRENT);

if ((retval = PAPI_create_eventset(&eventSet)) != PAPI_OK)
    handle_error(retval);

if ((retval = PAPI_add_named_event(eventSet, (char *) "rapl:::PP0_ENERGY:PACKAGE0")) != PAPI_OK)
    handle_error(retval);

if ((retval = PAPI_start(eventSet)) != PAPI_OK)
    handle_error(retval);

return 0.0;

运行应用程序时,我从PAPI_stop()获得PAPI error -9: EventSet is currently not running

我认为在函数的两次运行之间共享eventSet变量就足够了。 不幸的是,当调用PAPI_stop()时事件没有运行,这似乎不起作用。

有没有机会解决这个问题?

1 个答案:

答案 0 :(得分:1)

第三次拨打计时器时会发生什么?你已经停止了这些事件。您需要重新考虑您的设计,也许使用PAPI_read - Anycorn