Robert, Vince,
My main issue which this patch is that I wonder if the K7
support does qualify as a AMD64 PMU which is how this
patch would implement it.
Shouldn't we rather introduce an AMD_K7 PMU model
for libpfm. We could reuse most of the code but it would
logically be separate.
Opinions?
On 5/9/08, Robert Richter <[EMAIL PROTECTED]> wrote:
> Vince,
>
> thanks for your contibution. Please see my comments below.
>
> In general, please run checkpatch.pl that is part of the kernel
> scripts to keep the coding style. I found these errors:
>
> ERROR: code indent should use tabs where possible
> ERROR: spaces required around that '=' (ctx:VxV)
>
> -Robert
>
>
> On 02.05.08 21:40:18, Vince Weaver wrote:
> > Hello
> >
> > so here is code that adds "proper" support for the 32-bit Athlon systems
> > to libpfm.
> >
> > The event masks are a subset of the 64-bit versions with slight
> > differences. I split off a separate file insteald of using #defines
> > to separate it out.
> >
> > The values are based on the document
> > "AMD Athlon Processor x86 Code Optimization Guide". I've tested it on a
> > 32-bit Athlon system and it seems to work properly.
> >
> > I'm open to any comments people might have on this...
> >
> > Thanks,
> >
> > Vince
> >
> >
> > diff -u -r -N libpfm-3.4/lib/amd64_events.h
> libpfm-3.4-k7/lib/amd64_events.h
> > --- libpfm-3.4/lib/amd64_events.h 2008-04-25 09:46:04.000000000 -0400
> > +++ libpfm-3.4-k7/lib/amd64_events.h 2008-05-02 21:25:57.000000000 -0400
> > @@ -24,6 +24,7 @@
> > * applications on Linux.
> > */
> >
> > +#include "amd64_events_k7.h"
> > #include "amd64_events_k8.h"
> > #include "amd64_events_fam10h.h"
> >
> > @@ -34,6 +35,13 @@
> > unsigned int ret_inst;
> > };
> >
> > +static struct pme_amd64_table amd64_k7_table = {
> > + .num = PME_AMD64_K7_EVENT_COUNT,
> > + .events = amd64_k7_pe,
> > + .cpu_clks = PME_AMD64_K7_CPU_CLK_UNHALTED,
> > + .ret_inst = PME_AMD64_K7_RETIRED_INSTRUCTIONS,
> > +};
> > +
> > static struct pme_amd64_table amd64_k8_table = {
> > .num = PME_AMD64_K8_EVENT_COUNT,
> > .events = amd64_k8_pe,
> > diff -u -r -N libpfm-3.4/lib/amd64_events_k7.h
> libpfm-3.4-k7/lib/amd64_events_k7.h
> > --- libpfm-3.4/lib/amd64_events_k7.h 1969-12-31 19:00:00.000000000 -0500
> > +++ libpfm-3.4-k7/lib/amd64_events_k7.h 2008-05-02
> 21:26:26.000000000 -0400
> > @@ -0,0 +1,219 @@
> > +/*
> > + * Copyright (c) 2006, 2007 Advanced Micro Devices, Inc.
> > + * Contributed by Ray Bryant <[EMAIL PROTECTED]>
> > + * Contributed by Robert Richter <[EMAIL PROTECTED]>
> > + * Modified for K7 by Vince Weaver <vince _at_ csl.cornell.edu>
> > + *
> > + * Permission is hereby granted, free of charge, to any person obtaining
> a copy
> > + * of this software and associated documentation files (the "Software"),
> to deal
> > + * in the Software without restriction, including without limitation the
> rights
> > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or
> sell copies
> > + * of the Software, and to permit persons to whom the Software is
> furnished to do so,
> > + * subject to the following conditions:
> > + *
> > + * The above copyright notice and this permission notice shall be
> included in all
> > + * copies or substantial portions of the Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR IMPLIED,
> > + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> FITNESS FOR A
> > + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
> OR COPYRIGHT
> > + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
> IN AN ACTION OF
> > + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
> WITH THE SOFTWARE
> > + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> > + *
> > + * This file is part of libpfm, a performance monitoring support library
> for
> > + * applications on Linux.
> > + */
> > +
> > +/*
> > + * Definitions taken from "AMD Athlon Processor x86 Code Optimization
> Guide"
> > + * Table 11 February 2002
> > + */
> > +
> > +static pme_amd64_entry_t amd64_k7_pe[]={
> > +/* 0 */{.pme_name = "DATA_CACHE_ACCESSES",
> > + .pme_code = 0x40,
> > + .pme_desc = "Data Cache Accesses",
> > + },
> > +/* 1 */{.pme_name = "DATA_CACHE_MISSES",
> > + .pme_code = 0x41,
> > + .pme_desc = "Data Cache Misses",
> > + },
> > +/* 2 */{.pme_name = "DATA_CACHE_REFILLS",
> > + .pme_code = 0x42,
> > + .pme_desc = "Data Cache Refills from L2",
> > + .pme_flags = PFMLIB_AMD64_UMASK_COMBO,
> > + .pme_numasks = 6,
> > + .pme_umasks = {
> > + { .pme_uname = "L2_INVALID",
> > + .pme_udesc = "Invalid line from L2",
> > + .pme_ucode = 0x01,
> > + },
> > + { .pme_uname = "L2_SHARED",
> > + .pme_udesc = "Shared-state line from L2",
> > + .pme_ucode = 0x02,
> > + },
> > + { .pme_uname = "L2_EXCLUSIVE",
> > + .pme_udesc = "Exclusive-state line from L2",
> > + .pme_ucode = 0x04,
> > + },
> > + { .pme_uname = "L2_OWNED",
> > + .pme_udesc = "Owned-state line from L2",
> > + .pme_ucode = 0x08,
> > + },
> > + { .pme_uname = "L2_MODIFIED",
> > + .pme_udesc = "Modified-state line from L2",
> > + .pme_ucode = 0x10,
> > + },
> > + { .pme_uname = "ALL",
> > + .pme_udesc = "Shared, Exclusive, Owned, Modified State
> Refills",
> > + .pme_ucode = 0x1F,
> > + },
> > + },
> > + },
> > +/* 3 */{.pme_name = "DATA_CACHE_REFILLS_FROM_SYSTEM",
> > + .pme_code = 0x43,
> > + .pme_desc = "Data Cache Refills from System",
> > + .pme_flags = PFMLIB_AMD64_UMASK_COMBO,
> > + .pme_numasks = 6,
> > + .pme_umasks = {
> > + { .pme_uname = "INVALID",
> > + .pme_udesc = "Invalid",
> > + .pme_ucode = 0x01,
> > + },
> > + { .pme_uname = "SHARED",
> > + .pme_udesc = "Shared",
> > + .pme_ucode = 0x02,
> > + },
> > + { .pme_uname = "EXCLUSIVE",
> > + .pme_udesc = "Exclusive",
> > + .pme_ucode = 0x04,
> > + },
> > + { .pme_uname = "OWNED",
> > + .pme_udesc = "Owned",
> > + .pme_ucode = 0x08,
> > + },
> > + { .pme_uname = "MODIFIED",
> > + .pme_udesc = "Modified",
> > + .pme_ucode = 0x10,
> > + },
> > + { .pme_uname = "ALL",
> > + .pme_udesc = "Invalid, Shared, Exclusive, Owned, Modified",
> > + .pme_ucode = 0x1F,
> > + },
> > + },
> > + },
> > +/* 4 */{.pme_name = "DATA_CACHE_LINES_EVICTED",
> > + .pme_code = 0x44,
> > + .pme_desc = "Data Cache Lines Evicted",
>
>
> The spec description here is "Data cache writebacks". Need to figure
> out if the K8 event is backward compatible to this one. Otherwise we
> should rename it according to the spec.
>
>
> > + .pme_flags = PFMLIB_AMD64_UMASK_COMBO,
> > + .pme_numasks = 6,
> > + .pme_umasks = {
> > + { .pme_uname = "INVALID",
> > + .pme_udesc = "Invalid",
> > + .pme_ucode = 0x01,
> > + },
> > + { .pme_uname = "SHARED",
> > + .pme_udesc = "Shared",
> > + .pme_ucode = 0x02,
> > + },
> > + { .pme_uname = "EXCLUSIVE",
> > + .pme_udesc = "Exclusive",
> > + .pme_ucode = 0x04,
> > + },
> > + { .pme_uname = "OWNED",
> > + .pme_udesc = "Owned",
> > + .pme_ucode = 0x08,
> > + },
> > + { .pme_uname = "MODIFIED",
> > + .pme_udesc = "Modified",
> > + .pme_ucode = 0x10,
> > + },
> > + { .pme_uname = "ALL",
> > + .pme_udesc = "Invalid, Shared, Exclusive, Owned, Modified",
> > + .pme_ucode = 0x1F,
> > + },
> > + },
> > + },
> > +/* 5 */{.pme_name = "L1_DTLB_MISS_AND_L2_DTLB_HIT",
> > + .pme_code = 0x45,
> > + .pme_desc = "L1 DTLB Miss and L2 DTLB Hit",
> > + },
> > +/* 6 */{.pme_name = "L1_DTLB_AND_L2_DTLB_MISS",
> > + .pme_code = 0x46,
> > + .pme_desc = "L1 DTLB and L2 DTLB Miss",
> > + },
> > +/* 7 */{.pme_name = "MISALIGNED_ACCESSES",
> > + .pme_code = 0x47,
> > + .pme_desc = "Misaligned Accesses",
> > + },
> > + /* CPU_CLK_UNHALTED is undocumented in the Athlon Guide? */
> > +/* 8 */{.pme_name = "CPU_CLK_UNHALTED",
> > + .pme_code = 0x76,
> > + .pme_desc = "CPU Clocks not Halted",
> > + },
>
>
> Will check if the event exists and is the same as for K8.
>
>
> > +/* 9 */{.pme_name = "INSTRUCTION_CACHE_FETCHES",
> > + .pme_code = 0x80,
> > + .pme_desc = "Instruction Cache Fetches",
> > + },
> > +/* 10 */{.pme_name = "INSTRUCTION_CACHE_MISSES",
> > + .pme_code = 0x81,
> > + .pme_desc = "Instruction Cache Misses",
> > + },
> > +/* 11 */{.pme_name = "L1_ITLB_MISS_AND_L2_ITLB_HIT",
> > + .pme_code = 0x84,
> > + .pme_desc = "L1 ITLB Miss and L2 ITLB Hit",
> > + },
> > +/* 12 */{.pme_name = "L1_ITLB_MISS_AND_L2_ITLB_MISS",
> > + .pme_code = 0x85,
> > + .pme_desc = "L1 ITLB Miss and L2 ITLB Miss",
> > + },
> > +/* 13 */{.pme_name = "RETIRED_INSTRUCTIONS",
> > + .pme_code = 0xC0,
> > + .pme_desc = "Retired Instructions (includes exceptions, interrupts,
> resyncs)",
> > + },
> > +/* 14 */{.pme_name = "RETIRED_UOPS",
> > + .pme_code = 0xC1,
> > + .pme_desc = "Retired uops",
> > + },
> > +/* 15 */{.pme_name = "RETIRED_BRANCH_INSTRUCTIONS",
> > + .pme_code = 0xC2,
> > + .pme_desc = "Retired Branch Instructions",
> > + },
> > +/* 16 */{.pme_name = "RETIRED_MISPREDICTED_BRANCH_INSTRUCTIONS",
> > + .pme_code = 0xC3,
> > + .pme_desc = "Retired Mispredicted Branch Instructions",
> > + },
> > +/* 17 */{.pme_name = "RETIRED_TAKEN_BRANCH_INSTRUCTIONS",
> > + .pme_code = 0xC4,
> > + .pme_desc = "Retired Taken Branch Instructions",
> > + },
> > +/* 18 */{.pme_name = "RETIRED_TAKEN_BRANCH_INSTRUCTIONS_MISPREDICTED",
> > + .pme_code = 0xC5,
> > + .pme_desc = "Retired Taken Branch Instructions Mispredicted",
> > + },
> > +/* 19 */{.pme_name = "RETIRED_FAR_CONTROL_TRANSFERS",
> > + .pme_code = 0xC6,
> > + .pme_desc = "Retired Far Control Transfers",
> > + },
> > +/* 20 */{.pme_name = "RETIRED_BRANCH_RESYNCS",
> > + .pme_code = 0xC7,
> > + .pme_desc = "Retired Branch Resyncs (only non-control transfer
> branches)",
> > + },
> > +/* 21 */{.pme_name = "INTERRUPTS_MASKED_CYCLES",
> > + .pme_code = 0xCD,
> > + .pme_desc = "Interrupts-Masked Cycles",
> > + },
> > +/* 22 */{.pme_name = "INTERRUPTS_MASKED_CYCLES_WITH_INTERRUPT_PENDING",
> > + .pme_code = 0xCE,
> > + .pme_desc = "Interrupts-Masked Cycles with Interrupt Pending",
> > + },
> > +/* 23 */{.pme_name = "INTERRUPTS_TAKEN",
> > + .pme_code = 0xCF,
> > + .pme_desc = "Interrupts Taken",
> > + },
> > +};
> > +
> > +#define PME_AMD64_K7_EVENT_COUNT
> (sizeof(amd64_k7_pe)/sizeof(pme_amd64_entry_t))
> > +#define PME_AMD64_K7_CPU_CLK_UNHALTED 8
> > +#define PME_AMD64_K7_RETIRED_INSTRUCTIONS 13
> > diff -u -r -N libpfm-3.4/lib/pfmlib_amd64.c
> libpfm-3.4-k7/lib/pfmlib_amd64.c
> > --- libpfm-3.4/lib/pfmlib_amd64.c 2008-04-25 09:46:04.000000000 -0400
> > +++ libpfm-3.4-k7/lib/pfmlib_amd64.c 2008-05-02 21:30:14.000000000 -0400
> > @@ -75,7 +75,8 @@
> > #define AMD64_FAM10H AMD64_FAM10H_REV_B
> >
> > typedef enum {
> > - AMD64_CPU_UN,
> > + AMD64_CPU_UN,
> > + AMD64_K7,
>
>
> Fix whitspaces please.
>
>
> > AMD64_K8_REV_B,
> > AMD64_K8_REV_C,
> > AMD64_K8_REV_D,
> > @@ -92,6 +93,7 @@
> >
> > static const char *amd64_cpu_strs[]= {
> > "unknown model",
> > + "K7",
>
>
> Dito.
>
>
> > "K8 RevB",
> > "K8 RevC",
> > "K8 RevD",
> > @@ -125,7 +127,10 @@
> > static amd64_rev_t
> > amd64_get_revision(int family, int model, int stepping)
> > {
> > - if (family == 15) {
> > + if (family == 6) {
> > + return AMD64_K7;
> > + }
> > + else if (family == 15) {
>
>
> use:
>
> } else if ...
>
>
> > switch (model >> 4) {
> > case 0:
> > if (model == 5 && stepping < 2)
> > @@ -185,16 +190,28 @@
> > amd64_cpu_strs[revision]);
> > amd64_support.pmu_name = amd64_pmu.name;
> >
> > - /* defaults (K8) */
> > - amd64_pmu.events = amd64_k8_table.events;
> > - amd64_support.pme_count = amd64_k8_table.num;
> > - amd64_pmu.cpu_clks = amd64_k8_table.cpu_clks;
> > - amd64_pmu.ret_inst = amd64_k8_table.ret_inst;
> > - amd64_support.pmu_type = PFMLIB_AMD64_PMU;
> > - amd64_support.num_cnt = PMU_AMD64_NUM_COUNTERS;
> > - amd64_support.pmc_count = PMU_AMD64_NUM_COUNTERS;
> > - amd64_support.pmd_count = PMU_AMD64_NUM_COUNTERS;
> > -
> > + if (amd64_pmu.revision ==AMD64_K7) {
>
> " == "
>
> > + amd64_pmu.events = amd64_k7_table.events;
> > + amd64_support.pme_count = amd64_k7_table.num;
> > + amd64_pmu.cpu_clks = amd64_k7_table.cpu_clks;
> > + amd64_pmu.ret_inst = amd64_k7_table.ret_inst;
> > + amd64_support.pmu_type = PFMLIB_AMD64_PMU;
> > + amd64_support.num_cnt = PMU_AMD64_NUM_COUNTERS;
> > + amd64_support.pmc_count = PMU_AMD64_NUM_COUNTERS;
> > + amd64_support.pmd_count = PMU_AMD64_NUM_COUNTERS;
>
>
> Better return from function here and leave the rest as is.
>
> When changing indention for '=', please change it in the whole
> function.
>
>
> > + }
> > + else {
> > + /* defaults (K8) */
> > + amd64_pmu.events = amd64_k8_table.events;
> > + amd64_support.pme_count = amd64_k8_table.num;
> > + amd64_pmu.cpu_clks = amd64_k8_table.cpu_clks;
> > + amd64_pmu.ret_inst = amd64_k8_table.ret_inst;
> > + amd64_support.pmu_type = PFMLIB_AMD64_PMU;
> > + amd64_support.num_cnt = PMU_AMD64_NUM_COUNTERS;
> > + amd64_support.pmc_count = PMU_AMD64_NUM_COUNTERS;
> > + amd64_support.pmd_count = PMU_AMD64_NUM_COUNTERS;
> > + }
> > +
>
>
> Use tabs only for indention.
>
>
> > /* additional features */
> > if (IS_FAMILY_10H()) {
> > amd64_pmu.events = amd64_fam10h_table.events;
> >
> >
> > -------------------------------------------------------------------------
> > This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
> > Don't miss this year's exciting event. There's still time to save $100.
> > Use priority code J8TL2D2.
> >
> http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
> > _______________________________________________
> > perfmon2-devel mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/perfmon2-devel
> >
>
>
> --
> Advanced Micro Devices, Inc.
> Operating System Research Center
> email: [EMAIL PROTECTED]
>
>
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
> Don't miss this year's exciting event. There's still time to save $100.
> Use priority code J8TL2D2.
>
> http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
> _______________________________________________
> perfmon2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/perfmon2-devel
>
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
perfmon2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/perfmon2-devel