<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic How to read the Performance Counters on Intel Atom in Software Tuning, Performance Optimization &amp; Platform Monitoring</title>
    <link>https://community.intel.com/t5/Software-Tuning-Performance/How-to-read-the-Performance-Counters-on-Intel-Atom/m-p/1033462#M4346</link>
    <description>&lt;P&gt;Hello,&lt;BR /&gt;
	Pardon me if this is not the right platform for my question.&lt;/P&gt;

&lt;P&gt;I have intel Atom (silvermont) architecture and I am trying to read the msr. I do not have experience working with the performance counter at this level.&amp;nbsp;I have a found the code that can read and write the perf_global_ctrl, perf_fixed_ctr_ctrl, fixed_ctr.&amp;nbsp;&lt;BR /&gt;
	According to my understanding this code is for the general intel architecture with 3 Fixed performance counters and 4 GP counters. I have check in Intel Atom, I have 3 fixed counters and 2 GP counter (intel Intel® 64 and IA-32 Architectures Software Developer’s Manual&amp;nbsp;Combined Volumes:&amp;nbsp;1, 2A, 2B, 2C, 3A, 3B and 3C)&lt;/P&gt;

&lt;P&gt;I have also uploaded the code for the reference. I have tried to work with this code,&amp;nbsp;&amp;nbsp;{ MSR_WRITE, 0x38f, 0x0f, 0x07 }, &amp;nbsp; &amp;nbsp;this statement does not works 0x38f is the address to&amp;nbsp;a32_perf_fixed_ctr_ctrl, but other parameters are hard for me to change for my architecture without understanding them properly. Can you please help me explain this so I make them work on Intel Atom.&lt;/P&gt;

&lt;P&gt;My ultimate goal is to extract the intruction_retired and cpu_clk_unhalted.core parameters to calculate the IPC parameter.&lt;/P&gt;

&lt;P&gt;&amp;nbsp;struct MsrInOut msr_start[] = {&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x38f, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_perf_global_ctrl: disable 4 PMCs &amp;amp; 3 FFCs&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0xc1, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_pmc0: zero value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0xc2, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_pmc1: zero value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0xc3, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_pmc2: zero value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0xc4, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_pmc3: zero value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x309, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_fixed_ctr0: zero value (35-17)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x30a, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_fixed_ctr1: zero value (35-17)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x30b, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_fixed_ctr2: zero value (35-17)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x186, 0x004101c2, 0x00 }, // ia32_perfevtsel1, UOPS_RETIRED.ALL (19-28)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x187, 0x0041010e, 0x00 }, // ia32_perfevtsel0, UOPS_ISSUED.ANY (19.22)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x188, 0x01c1010e, 0x00 }, // ia32_perfevtsel2, UOPS_ISSUED.ANY-stalls (19-22)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x189, 0x004101a2, 0x00 }, // ia32_perfevtsel3, RESOURCE_STALLS.ANY (19-27)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x38d, 0x222, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_perf_fixed_ctr_ctrl: ensure 3 FFCs enabled&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x38f, 0x0f, 0x07 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_perf_global_ctrl: enable 4 PMCs &amp;amp; 3 FFCs&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_STOP, 0x00, 0x00 }&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; };&lt;/P&gt;

&lt;P&gt;&amp;nbsp; &amp;nbsp; struct MsrInOut msr_stop[] = {&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x38f, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_perf_global_ctrl: disable 4 PMCs &amp;amp; 3 FFCs&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x38d, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_perf_fixed_ctr_ctrl: clean up FFC ctrls&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_READ, 0xc1, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_pmc0: read value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_READ, 0xc2, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_pmc1: read value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_READ, 0xc3, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_pmc2: read value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_READ, 0xc4, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_pmc3: read value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_READ, 0x309, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_fixed_ctr0: read value (35-17)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_READ, 0x30a, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_fixed_ctr1: read value (35-17)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_READ, 0x30b, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_fixed_ctr2: read value (35-17)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_STOP, 0x00, 0x00 }&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; };&lt;/P&gt;

&lt;P&gt;&lt;SPAN style="font-size: 1em; line-height: 1.5;"&gt;struct MsrInOut {&lt;/SPAN&gt;&lt;/P&gt;

&lt;P&gt;&amp;nbsp; &amp;nbsp; unsigned int op; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// MsrOperation&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; unsigned int ecx; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // msr identifier&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; union {&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct {&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned int eax; &amp;nbsp; &amp;nbsp; // low double word&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned int edx; &amp;nbsp; &amp;nbsp; // high double word&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned long long value; // quad word&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; };&lt;BR /&gt;
	};&lt;/P&gt;

&lt;P&gt;Appreciate your help,&lt;/P&gt;</description>
    <pubDate>Thu, 23 Oct 2014 16:12:37 GMT</pubDate>
    <dc:creator>Ayam</dc:creator>
    <dc:date>2014-10-23T16:12:37Z</dc:date>
    <item>
      <title>How to read the Performance Counters on Intel Atom</title>
      <link>https://community.intel.com/t5/Software-Tuning-Performance/How-to-read-the-Performance-Counters-on-Intel-Atom/m-p/1033462#M4346</link>
      <description>&lt;P&gt;Hello,&lt;BR /&gt;
	Pardon me if this is not the right platform for my question.&lt;/P&gt;

&lt;P&gt;I have intel Atom (silvermont) architecture and I am trying to read the msr. I do not have experience working with the performance counter at this level.&amp;nbsp;I have a found the code that can read and write the perf_global_ctrl, perf_fixed_ctr_ctrl, fixed_ctr.&amp;nbsp;&lt;BR /&gt;
	According to my understanding this code is for the general intel architecture with 3 Fixed performance counters and 4 GP counters. I have check in Intel Atom, I have 3 fixed counters and 2 GP counter (intel Intel® 64 and IA-32 Architectures Software Developer’s Manual&amp;nbsp;Combined Volumes:&amp;nbsp;1, 2A, 2B, 2C, 3A, 3B and 3C)&lt;/P&gt;

&lt;P&gt;I have also uploaded the code for the reference. I have tried to work with this code,&amp;nbsp;&amp;nbsp;{ MSR_WRITE, 0x38f, 0x0f, 0x07 }, &amp;nbsp; &amp;nbsp;this statement does not works 0x38f is the address to&amp;nbsp;a32_perf_fixed_ctr_ctrl, but other parameters are hard for me to change for my architecture without understanding them properly. Can you please help me explain this so I make them work on Intel Atom.&lt;/P&gt;

&lt;P&gt;My ultimate goal is to extract the intruction_retired and cpu_clk_unhalted.core parameters to calculate the IPC parameter.&lt;/P&gt;

&lt;P&gt;&amp;nbsp;struct MsrInOut msr_start[] = {&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x38f, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_perf_global_ctrl: disable 4 PMCs &amp;amp; 3 FFCs&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0xc1, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_pmc0: zero value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0xc2, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_pmc1: zero value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0xc3, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_pmc2: zero value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0xc4, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_pmc3: zero value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x309, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_fixed_ctr0: zero value (35-17)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x30a, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_fixed_ctr1: zero value (35-17)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x30b, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_fixed_ctr2: zero value (35-17)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x186, 0x004101c2, 0x00 }, // ia32_perfevtsel1, UOPS_RETIRED.ALL (19-28)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x187, 0x0041010e, 0x00 }, // ia32_perfevtsel0, UOPS_ISSUED.ANY (19.22)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x188, 0x01c1010e, 0x00 }, // ia32_perfevtsel2, UOPS_ISSUED.ANY-stalls (19-22)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x189, 0x004101a2, 0x00 }, // ia32_perfevtsel3, RESOURCE_STALLS.ANY (19-27)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x38d, 0x222, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_perf_fixed_ctr_ctrl: ensure 3 FFCs enabled&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x38f, 0x0f, 0x07 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_perf_global_ctrl: enable 4 PMCs &amp;amp; 3 FFCs&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_STOP, 0x00, 0x00 }&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; };&lt;/P&gt;

&lt;P&gt;&amp;nbsp; &amp;nbsp; struct MsrInOut msr_stop[] = {&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x38f, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_perf_global_ctrl: disable 4 PMCs &amp;amp; 3 FFCs&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_WRITE, 0x38d, 0x00, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_perf_fixed_ctr_ctrl: clean up FFC ctrls&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_READ, 0xc1, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_pmc0: read value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_READ, 0xc2, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_pmc1: read value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_READ, 0xc3, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_pmc2: read value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_READ, 0xc4, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ia32_pmc3: read value (35-5)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_READ, 0x309, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_fixed_ctr0: read value (35-17)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_READ, 0x30a, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_fixed_ctr1: read value (35-17)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_READ, 0x30b, 0x00 }, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ia32_fixed_ctr2: read value (35-17)&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { MSR_STOP, 0x00, 0x00 }&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; };&lt;/P&gt;

&lt;P&gt;&lt;SPAN style="font-size: 1em; line-height: 1.5;"&gt;struct MsrInOut {&lt;/SPAN&gt;&lt;/P&gt;

&lt;P&gt;&amp;nbsp; &amp;nbsp; unsigned int op; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// MsrOperation&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; unsigned int ecx; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // msr identifier&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; union {&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct {&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned int eax; &amp;nbsp; &amp;nbsp; // low double word&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned int edx; &amp;nbsp; &amp;nbsp; // high double word&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned long long value; // quad word&lt;BR /&gt;
	&amp;nbsp; &amp;nbsp; };&lt;BR /&gt;
	};&lt;/P&gt;

&lt;P&gt;Appreciate your help,&lt;/P&gt;</description>
      <pubDate>Thu, 23 Oct 2014 16:12:37 GMT</pubDate>
      <guid>https://community.intel.com/t5/Software-Tuning-Performance/How-to-read-the-Performance-Counters-on-Intel-Atom/m-p/1033462#M4346</guid>
      <dc:creator>Ayam</dc:creator>
      <dc:date>2014-10-23T16:12:37Z</dc:date>
    </item>
  </channel>
</rss>

