Skip to contentSkip to conversation

a couple questions on pfmon-2.0

Linux-ia64 Ray Bryant 2 participants 2 messages Dec 10, 2002 – Dec 11, 2002

lore
Share & tools
lore

Ray Bryant

author
#0 lore raw

Stephane,

There are both 2.0 and 2.0-1 versions mentioned in your note. Are these versions signifcantly different?? which one should we be using?

WRT documentation -- this is great, much improved. One question I still had is the following: If I fork a child process, after calling pfm_initialize(), and, assuming we bind threads to processors in some fashion, do I need to call pfm_initialize() again in the child thread? What if the child thread is created by pthread_create()?

My experience with this is that most routines have to be called on the thread (e. g. things that get or set PMU regs have to be called in the appropriate child process, whilst things like pfm_initialize() only need to be called in the parent thread). Is that correct at all?

So I'm wondering if it would help in the documentation if you could distinguish between these two cases in some way. That would make it clearer (for me, at least). I'm not sure how to do this in a way that is independent of the way you started
the threads though. Perhaps you can use the words "once per context" or some such.

Or is this all covered someplace in the docs that I haven't found yet?

Thanks,

Signature · 7 lines
Best Regards,
Ray
-----------------------------------------------
Ray Bryant               SGI
512-453-9679 (work)      512-507-7807 (cell)
[email protected]           [email protected]
-----------------------------------------------
#1 lore raw

Ray,

Quoted 5 lines · Ray Bryant

Stephane,

There are both 2.0 and 2.0-1 versions mentioned in your note. Are these versions signifcantly different?? which one should we be using?

That's the same version. The -1 comes from RPM version number.

Quoted 5 lines

WRT documentation -- this is great, much improved. One question I still had is the following: If I fork a child process, after calling pfm_initialize(), and, assuming we bind threads to processors in some fashion, do I need to call pfm_initialize() again in the child thread? What if the child thread is created by pthread_create()?

Yes, pfm_initialize() only needs to be called once per application. It is used to autodetect the host PMU.

Quoted 7 lines

My experience with this is that most routines have to be called on the thread (e. g. things that get or set PMU regs have to be called in the appropriate child process, whilst things like pfm_initialize() only need to be called in the parent thread). Is that correct at all?

Quoted 7 lines

So I'm wondering if it would help in the documentation if you could distinguish between these two cases in some way. That would make it clearer (for me, at least). I'm not sure how to do this in a way that is independent of the way you started
the threads though. Perhaps you can use the words "once per context" or some such.

The library is threadsafe. It is important to keep in mind that the library NEVER invokes the perfmonctl() system call. As such, the library functions can be called from anywhere, the master thread or worker threads. The case of pfm_initialize() is kind of unique. What you see in pfmon is just one way of using the library. For pfmon and in case of system wide monitoring, all the CPUS monitor the same set of events, so we prepare the arguments to the perfmonctl() once in the master thread and then we simply use them in all the pinned worker threads. The CPU-specific information is mostly in the pfarg_context_t argument which is not a library data structure but a kernel structure.

Quoted 1 line

Or is this all covered someplace in the docs that I haven't found yet?

No, but I will make the clarification in the man pages.

Signature · 1 line
-Stephane