Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Mar 2012 10:03:35 +0100
From:      Fabien Thomas <fabien.thomas@netasq.com>
To:        Vitaly Magerya <vmagerya@gmail.com>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: pmc(3): when are the counters updated?
Message-ID:  <C8C86488-254E-45B3-9636-9272DC67CD0C@netasq.com>
In-Reply-To: <CAL409Kxng3Yzw=grvP=fvbdLrqcOG_bG_ajaO8thZEPJtk2YaQ@mail.gmail.com>
References:  <CAL409Kxng3Yzw=grvP=fvbdLrqcOG_bG_ajaO8thZEPJtk2YaQ@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--Apple-Mail=_D3015E11-0567-4272-83FF-B445D0D19193
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=iso-8859-1


Le 11 mars 2012 =E0 16:45, Vitaly Magerya a =E9crit :

> 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.
>=20
> Here's a test program:
>=20
>    #include <sys/types.h>
>    #include <pmc.h>
>    #include <stdio.h>
>    #include <unistd.h>
>=20
>    int main() {
>        pmc_id_t pmcid;
>        pmc_value_t value;
>        int i;
>=20
>        pmc_init();
>        pmc_allocate("instructions", PMC_MODE_TC, 0, PMC_CPU_ANY, =
&pmcid);
>        pmc_start(pmcid);
>        for (i =3D 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);
>    }
>=20
> It's output on my system (FreeBSD 8.2 amd64, an Intel Atom processor)
> is something like this:
>=20
>    first reading:  0
>    second reading: 15090110
>=20
> 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.
>=20
> 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.

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


--Apple-Mail=_D3015E11-0567-4272-83FF-B445D0D19193--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?C8C86488-254E-45B3-9636-9272DC67CD0C>