gprof
Michael Trimarchi
trimarchi@gandalf.sssup.it
Tue Sep 27 10:59:00 GMT 2005
Ken Raeburn wrote:
> On Sep 20, 2005, at 06:31, Michael Trimarchi wrote:
>
>> >But also, if you care about the accuracy of the results, you may
>> need to modify the C runtime support code for >profiling, which
>> typically updates the per-function data in a manner that is not
>> thread-safe.
>> may you explain more precisely this point?
>> Regards
>> Michael
>
>
> With basic profiling, the runtime support code keeps track of how
> often the CPU program counter is in a given range of values, with
> fairly fine granularity. Later this table is dumped out, and (g)prof
> interprets it in combination with symbol information from the
> executable. For example, addresses XXX through YYY correspond to
> function A, and so many ticks at a certain frequency were counted
> with the PC in that range, so here's the amount of time the program
> spent in that function. But that may be inaccurate in multithreaded
> programs if the counter is implemented as read counter value N,
> increment value, another thread runs for a bit and changes the
> counter, store counter value N+1; you've just lost the change made by
> the other thread.
>
> For graph profiling, you also need data recorded on entry to a
> function indicating where the function was called from, and how many
> times it was called from each call site. Since you could have
> arbitrarily many such call sites, this is likely to involve dynamic
> memory allocation, walking through some data structures, etc. If
> it's not done just right, it might even result in crashes in
> multiprocessor, multithreaded situations, if you're really unlucky
> with the timing.
>
> I've never gotten around to modifying the support code to try to make
> it thread-safe. Using mutex locks would be the obvious approach, but
> probably kind of expensive compared to some of the atomic operations
> a few processors have available, or "store if another cpu or thread
> hasn't stored here, and set condition codes to tell me", etc.
>
> You might just get kind of lucky with the existing support code,
> though, your program might not crash, and the numbers might even be
> vaguely accurate...
>
> Ken
>
For example, to compute the time spent inside a function foo()
(starting at address X and ending at address Y) the system sample each
tick looking if the program counter is between X and Y. That may be
inaccurate in multithreaded programs if the accounting of a
counter C is implemented as the following set of instructions:
read counter value C
C=C+1
store C
If another thread runs for a bit interrupting the thread between 2 and 3,
and that thread changes the counter, then the value stored by the
interrupted
thread is N+1, losing an increment. Is it ok?
Regards Michael
More information about the Binutils
mailing list