pmc(3): when are the counters updated?

Fabien Thomas fabien.thomas at netasq.com
Mon Mar 12 09:03:38 UTC 2012


Le 11 mars 2012 à 16:45, Vitaly Magerya a écrit :

> Hi, folks. I'm trying to use pmc(3) to analyze code fragments, and
> I've run into strange behavior: the counter values returned by
> pmc_read(3) sometimes show no increment between readings, but are
> updated a second later; even if the PMC in question was stopped
> before.
> 
> Here's a test program:
> 
>    #include <sys/types.h>
>    #include <pmc.h>
>    #include <stdio.h>
>    #include <unistd.h>
> 
>    int main() {
>        pmc_id_t pmcid;
>        pmc_value_t value;
>        int i;
> 
>        pmc_init();
>        pmc_allocate("instructions", PMC_MODE_TC, 0, PMC_CPU_ANY, &pmcid);
>        pmc_start(pmcid);
>        for (i = 0; i < 5000000; i++);
>        pmc_stop(pmcid);
>        pmc_read(pmcid, &value);
>        printf("first reading:  %lu\n", (unsigned long)value);
>        sleep(1);
>        pmc_read(pmcid, &value);
>        printf("second reading: %lu\n", (unsigned long)value);
>    }
> 
> It's output on my system (FreeBSD 8.2 amd64, an Intel Atom processor)
> is something like this:
> 
>    first reading:  0
>    second reading: 15090110
> 
> I don't really like both numbers; I expect the first reading not
> to be zero (there obviously are instructions between pmc_start and
> pmc_stop), and I expect the second reading not to differ from the
> first, as the PMC was stopped before both of them, so it's value
> should not change.
> 
> So, what's going on here? Is this the intended behavior, or can it
> be changed? And how do I get accurate readings?

If i remember well:
The current code will get real HW PMC if the PMC is running and attached to owner.
The first case is not true in your code so you get the saved value which is updated at
process switch out time.

I think you can do:
pmc_read
pmc_stop.

> 
> (BTW, is this the right list for such questions?)
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"



More information about the freebsd-hackers mailing list