Hello,

Based on my conversation with Corey, I have been working hard to
update libpfm to implement all the modifications we've talked about.

I am glad to report that I have just updated the GIT tree with the changes.
They are quite massive. The user API has been changed, I would say
simplified, with fewer more compact calls.

There are some new user visible features and many internal changes.
The motivation was to:
  - provide default unit masks for some events
  - reinforce the unit mask combinations constraints to avoid mistakes
  - provide the user with the description of what is actually setup


It is possible for tools to figure out default unit masks. Here is
an example on Intel Core with showevtinfo:

PMU name : core (Intel Core)
Name     : L2_ST
Desc     : L2 store requests
Code     : 0x2a
Umask-00 : 0x40 : [SELF] : This core (DEFAULT)
Umask-01 : 0xc0 : [BOTH_CORES] : Both cores
Umask-02 : 0x0f : [MESI] : Any cacheline access (DEFAULT)
Umask-03 : 0x01 : [I_STATE] : Invalid cacheline
Umask-04 : 0x02 : [S_STATE] : Shared cacheline
Umask-05 : 0x04 : [E_STATE] : Exclusive cacheline
Umask-06 : 0x08 : [M_STATE] : Modified cacheline
Modif-00 : 0x00 : [u] : monitor at priv level 1, 2, 3 (boolean)
Modif-01 : 0x01 : [k] : monitor at priv level 0 (boolean)
Modif-02 : 0x02 : [i] : invert (boolean)
Modif-03 : 0x03 : [e] : edge level (boolean)
Modif-04 : 0x04 : [c] : counter-mask in range [0-255] (integer)

By typing:

$ LIBPFM_VERBOSE=1 perf_examples/task -e l2_st date
[0x514f2a event_sel=0x2a umask=0x4f os=0 usr=1 en=1 int=1 inv=0 edge=0
cnt_mask=0] L2_ST:SELF:I_STATE:S_STATE:E_STATE:M_STATE:k=0:u=1:e=0:i=0:c=0
PERF[type=4 val=0x514f2a e_u=0 e_k=1 e_hv=1]
L2_ST:SELF:I_STATE:S_STATE:E_STATE:M_STATE:k=0:u=1:e=0:i=0:c=0
Thu Dec 17 19:38:17 CET 2009
                 495 l2_st

You see that the library picked  up a default for each unit mask group
for the event.
If an event has unit masks which are logically grouped, then either
there is a default for each
group, or the user has to specify one otherwise an error is generated.

There are two new API calls:
       pfm_get_event_info(int idx, pfm_event_info_t *info);
        pfm_get_event_attr_info(int idx, int attridx,
pfm_event_attr_info_t *info);

 They supersede the following calls (which have been removed):

        const char *pfm_get_event_name(int idx);
        const char *pfm_get_event_desc(int idx);
        pfm_pmu_t pfm_get_event_pmu(int idx);
        pfm_err_t pfm_get_event_code(int idx, uint64_t *code);

        int pfm_get_event_nattrs(int idx);
        const char *pfm_get_event_attr_name(int idx, int attr_idx);
        const char *pfm_get_event_attr_desc(int idx, int attr_idx);
        pfm_err_t pfm_get_event_attr_code(int idx, int attr_idx,
uint64_t *code);
        pfm_attr_t pfm_get_event_attr_type(int idx, int attr_idx);


There are way more internal changes which help provide a much more robust
library which ensures the user does understand what is being setup while at
the same time making it easier to measure an event quickly.

Simply pull from GIT to get the update.
Note that the man pages have not yet been updated, but all examples
have been.

Special thanks to Corey for a fruitful discussion.

------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev 
_______________________________________________
perfmon2-devel mailing list
perfmon2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/perfmon2-devel

Reply via email to