From 8b7fb2464ae2969d555c82c751878d3b07a89bad Mon Sep 17 00:00:00 2001 From: beeman Date: Wed, 9 Oct 2024 13:05:04 -0700 Subject: [PATCH 01/13] minor text improvements, plus rewrite of TMA chapter --- body.adoc | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/body.adoc b/body.adoc index bbfd09f..81509e0 100644 --- a/body.adoc +++ b/body.adoc @@ -4,10 +4,10 @@ All the events and metrics are split between several groups which are described in details sub-sections below. In addition most of the groups are further split into 2 variants: -* RETIRED - for events counted at retirement. For example, CACHE_RETIRED.L2.LOAD.MISS event will count L2 misses caused by retired load instructions -* SPEC - for speculative events. For example, CACHE_SPEC.L2.LOAD.MISS event will count L2 misses caused by load instructions regardless of whether they were retired or not. +* RET - for non-speculative events counted at retirement. For example, INST.RET counts retired instructions. +* SPEC - for speculative events. For example, INST.SPEC counts instructions that are issued to the backend pipeline, regardless of whether they retire. -In general RETIRED events look more useful for performance analysis. In addition in the future it may be possible to provide more context for them - e.g. precise sample IP. But on the other hand they it may be significantly more expensive to implement. It is up to implementations to decide if they want to provide RETIRED, SPEC or both variants of a group. +NOTE: _In general, RET events are more useful for performance analysis, since they are consistent with software's view of the instruction flow. But they can be significantly more expensive to implement, as they require event data to be staged along with the associated instruction to retirement. It is up to implementations to decide whether to support the RET, SPEC, or both variants of an event._ === GEN @@ -29,7 +29,7 @@ include::adoc_event_tables/spec.adoc[] === CTRL_FLOW (retirement) -Retirement control flow group which contains events and metrics for measuring things branch mispredictions, data mis-speculations etc. +Retirement control flow group which contains events and metrics for counting all control transfer instructions, or just those that were mispredicted, including breakdowns by transfer type. include::adoc_event_tables/prediction_retired.adoc[] @@ -77,12 +77,29 @@ include::adoc_event_tables/tlb_spec_metrics.adoc[] This group contains events and metrics related for Topdown Microarchitecture Analysis (TMA) methodology. -The TMA methodology categorizes CPU execution time at a high level first. This step flags (reports high fraction value) some domain(s) for possible investigation. Next, the user can drill down into those flagged domains, and can safely ignore all non-flagged domains. The process is repeated in a hierarchical manner until a specific performance issue is determined or at least a small subset of candidate issues is identified for potential investigation. +TMA allows even developers with minimal microarchitecture knowledge to understand, for a given workload, where bottlenecks reside. It does so by accounting for the utilization of each pipeline "slot" in the microarchitecture. When the hardware is utilized with optimal efficiency, each slot is occupied by an instruction or micro-operation (a.k.a., uop) that will go on to execute and retire. When bottlenecks occur, due perhaps to a cache miss, branch misprediction, or any number of other microarchitectural conditions, some slots may be either unused or thrown away, which results in inefficiency and ultimately reduced performance. TMA is able to identify these wasted slots, and the stalls, clears, misses, or other events which caused them. This enables developers to make informed decisions when tuning their code. -Given the highly sophisticated microarchitecture, the first interesting question is how and where to do the first level breakdown? TMA chooses the issue point as it is the natural border that splits the frontend and backend portions of machine. +TMA accomplishes this by defining a set of hierarchical states into which each slot falls, based on the boundary between the frontend (instruction fetch and decode) and the backend (instruction execution and retire) of the processor. Each cycle, the frontend can issue some implementation-defined number _N_ instructions/uops to the backend, hence there are _N_ issue slots to be categorized per cycle. At the top level, issue slots fall into one of states depicted in the figure below. -At issue point it classifies each pipeline-slot into one of four base categories: Frontend Bound, Backend Bound, Bad Speculation and Retiring. -If a uop is issued in a given cycle, it would eventually either get retired or cancelled. Thus it can be attributed to either Retiring or Bad Speculation respectively. Otherwise it can be split into whether there was a backend-stall or not. A backend-stall is a backpressure mechanism the Backend asserts upon resource unavailability (e.g. lack of load buffer entries). In such a case TMA attributes the stall to the Backend, since even if the Frontend was ready with more uops it would not be able to pass them down the pipeline. If there was no backend-stall, it means the Frontend should have delivered some uops while the Backend was ready to accept them; hence it is tagged with Frontend Bound. +.Topdown Level 1 +image::images/tma-l1.png[TMA Level 1] + +* Frontend Bound - The frontend did not issue a uop to the backend for execution. Example causes include stalls that result from cache or TLB misses during instruction fetch. +* Backend Bound - The backend could not consume an uop from the frontend. Example causes include backpressure that results from cache or TLB misses on data (load/store) accesses, or from oversubscribed execution units. +* Bad Speculation - The uop was dropped, as a result of a pipeline clear. Example clears include branch/jump mispredictions, or memory ordering clears. This category also includes pipeline clear recovery cycles, during which issue slots go unfilled. +* Retiring - The uop retired. Ideally the majority of slots fall into this state. + +Many of the top-level states listed above include further breakdown at the 2nd and 3rd levels of the TMA hierarchy. See details in the figure below. + +.Topdown Hierarchy +image::images/tma-full.png[TMA Hierarchy] + +[NOTE] +==== +_Some imprecision within the event hierarchy is allowed and even expected. The standard L2 and L3 events are unlikely to sum precisely to the parent L1 or L2 events, respectively, as it is expected that there are additional sources of bottlenecks beyond those represented by the standard events. The exception is the Backend Bound L2 events (Core Bound and Memory Bound), which ideally should sum to the Backend Bound event total._ + +_Implementations may opt to add custom L2 or L3 events, to identify additional bottlenecks specific to the microarchitecture._ +==== include::adoc_event_tables/topdown.adoc[] From 47d655a676f638b01d1d4b0ab2ae119cf3c54a89 Mon Sep 17 00:00:00 2001 From: beeman Date: Wed, 9 Oct 2024 13:05:38 -0700 Subject: [PATCH 02/13] add non-normative section, comment on replacing events with formulas --- intro.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/intro.adoc b/intro.adoc index 13c962c..c6ec555 100644 --- a/intro.adoc +++ b/intro.adoc @@ -9,4 +9,6 @@ The Performance Events non-ISA extension provides a set of standard performance [%unbreakable] ==== This extension does not standardize event selector values - these are left up to implementations. + +An implementation may opt to support any of the standard events described below as an event formula rather than a hardware event. As an example, for a typical implementation, the TOPDOWN.SLOTS event count could be derived from CYCLES.HART * ConstantIssueWidth. It is strongly advised that any such formulas require counting no more events than the number of programmable counters implemented can support simultaneously. Requiring the workload to be run multiple times to satisfy a single formula risks run-to-run noise reducing the fidelity of the profile results. Also, implementing an event as a formula means that the user cannot use Sscofpmf to sample on that event. Thus care should be taken when choosing which (if any) events to support in this manner. ==== \ No newline at end of file From 7ebf616b80fb78d4e60401f387666920e7076def Mon Sep 17 00:00:00 2001 From: beeman Date: Wed, 9 Oct 2024 13:06:09 -0700 Subject: [PATCH 03/13] update TG and extension name --- header.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/header.adoc b/header.adoc index d564306..4772fa9 100644 --- a/header.adoc +++ b/header.adoc @@ -1,7 +1,7 @@ = RISC-V Performance Events Authors: Author 1, Author 2 -:docgroup: RISC-V Task Group -:description: RISC-V Performance Events +:docgroup: RISC-V Performance Events TG +:description: RISC-V Hart Performance Events :company: RISC-V.org :revdate: 09/2024 :revnumber: 1.0 From 98f103d78d14242cc9528e0c1525abc8bcea2eaa Mon Sep 17 00:00:00 2001 From: beeman Date: Wed, 9 Oct 2024 13:06:46 -0700 Subject: [PATCH 04/13] update extension name again --- header.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/header.adoc b/header.adoc index 4772fa9..164de2a 100644 --- a/header.adoc +++ b/header.adoc @@ -1,4 +1,4 @@ -= RISC-V Performance Events += RISC-V Hart Performance Events Authors: Author 1, Author 2 :docgroup: RISC-V Performance Events TG :description: RISC-V Hart Performance Events From 6f32bed53c28019e3403c2edfa401ffb465785e5 Mon Sep 17 00:00:00 2001 From: beeman Date: Wed, 9 Oct 2024 13:07:12 -0700 Subject: [PATCH 05/13] add non-normative section, comment on replacing events with formulas --- intro.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/intro.adoc b/intro.adoc index c6ec555..40589ee 100644 --- a/intro.adoc +++ b/intro.adoc @@ -8,7 +8,7 @@ The Performance Events non-ISA extension provides a set of standard performance [NOTE] [%unbreakable] ==== -This extension does not standardize event selector values - these are left up to implementations. +_This extension does not standardize event selector values - these are left up to implementations._ -An implementation may opt to support any of the standard events described below as an event formula rather than a hardware event. As an example, for a typical implementation, the TOPDOWN.SLOTS event count could be derived from CYCLES.HART * ConstantIssueWidth. It is strongly advised that any such formulas require counting no more events than the number of programmable counters implemented can support simultaneously. Requiring the workload to be run multiple times to satisfy a single formula risks run-to-run noise reducing the fidelity of the profile results. Also, implementing an event as a formula means that the user cannot use Sscofpmf to sample on that event. Thus care should be taken when choosing which (if any) events to support in this manner. +_An implementation may opt to support any of the standard events described below as an event formula rather than a hardware event. As an example, for a typical implementation, the TOPDOWN.SLOTS event count could be derived from CYCLES.HART * ConstantIssueWidth. It is strongly advised that any such formulas require counting no more events than the number of programmable counters implemented can support simultaneously. Requiring the workload to be run multiple times to satisfy a single formula risks run-to-run noise reducing the fidelity of the profile results. Also, implementing an event as a formula means that the user cannot use Sscofpmf to sample on that event. Thus care should be taken when choosing which (if any) events to support in this manner._ ==== \ No newline at end of file From 66cc400b8657200d9af1387a08803c47edace879 Mon Sep 17 00:00:00 2001 From: beeman Date: Wed, 9 Oct 2024 13:07:34 -0700 Subject: [PATCH 06/13] add Dmitriy and Beeman as contributors --- contributors.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contributors.adoc b/contributors.adoc index 13fd776..a55e6ea 100644 --- a/contributors.adoc +++ b/contributors.adoc @@ -3,5 +3,5 @@ This RISC-V specification has been contributed to directly or indirectly by: [%hardbreaks] -* Author1 -* Author2 +* Dmitry Ryabtsev +* Beeman Strong From 6357647697260aed86526ff0cbdc77831d8d3913 Mon Sep 17 00:00:00 2001 From: beeman Date: Wed, 9 Oct 2024 13:08:09 -0700 Subject: [PATCH 07/13] add TMA flowchart and diagram images --- images/tma-full.png | Bin 0 -> 27122 bytes images/tma-l1.png | Bin 0 -> 24014 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/tma-full.png create mode 100644 images/tma-l1.png diff --git a/images/tma-full.png b/images/tma-full.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e634de44695292d2157cc2a7ad94c6fa089593 GIT binary patch literal 27122 zcmdqJ2RL0@w>ORm5)qvQK?o`8))T$=NQmCsW@|f$-btbd(TNZtO$!^*OM(!4>m>-H z2SM}_<(msR?|IKT_rCZ0-~adA^WNu?*w&hJtvTlybBy2kjWKuVt()>hr)f@OVPO#| zD#)l~Vd0>#u&{{<@W7SZ_$ndb7q+vyycAY`8{I4x)&=W(vO4$d-Qfs3ODq;%>7!39 zJlxhu=X)%?GAukivUZl{_neRp;3K$hYGvtgd_xuKiLkRXW#N(I=i~;ru4p41ERb%_ z;N#6Z;6E5QxXddBK7ktod`BPM1^BLlE0TBb+F5E_nkgghLH&6JIe7)Z8zn8Hn+5WjmJG#^(>Cuanh+~HJzdoXmz+1%95^5{C~4P7xqI$2mc z9bEzw=3(KLW#N_tH=rM0X$yp@m6NGG_yb{a)X338-Tls86<#Uso4ousy!Vju>R{B+ zqZ~}Zun*sFdwBfdJKOPgm0C*7eEDMjLE7!S& zjxJa^{TjgWz@ZBo2+v=$IUG9=x0MUR!qWNpX-7TpA(3|X5O@FiqB+vR0jR(~H8gc{ zf+T%7gX5RLk#@(^KE7}l=*mB}fG%kKX;q=C+6aq#)<YGNU01L~SXuviGavWy z9edMXjgK!lTblyKJL-RU>Gy&;TE}0j>4Zdr=lxD@zrX#fk-fXLB_xpF1bO@(pgaHf zeScdGr{8wYf9G*ZI#P~0TCQd`YPM1q9zf%W+<7=kJT4?p# zgQ1rH6-j|M$AbRP2M<}rKj_0>3gLJ={!R!|rWRl<8h0(tUF=NnL1yM~8h>YL@WB4J zh=cc7dH=B|q)g3iEgc|{NI{$6?=K8qzJDnU-d{%X@4Ywp{v-@J04eVMTS-IUmuLF7 zw^aOpl7=+W2?AUHruzc+OESN68ow_6z4rwGy^y>5ozGCUv_~Gg$A1%9{D#Vocg0`H zg6EeV`+E!H7@Pl27#fyN2va+R=l>7R8z88AG6*LCq>sW42vi{e80K&SU<(9EhidTu z6lnd?oACUCRlnOcyvGjb_k#L`$o@V^>p0H&ouDKwESxNzLFfrBP3o#uVtiO@~?BBy+!Tucg-BE!E7nS21|6g~)|GcsK z(?0pNDgK4A`upt@*q;NDV$I8}d|pxYmmDM(HztaE*Y9Q* z<6S)`H6=k%laa|Gsk+W26VjMy9CK?SvfNBY_6;km4QUizV@~ zjn|&teT#cCCMmN+IgHC7qAOw5Tot7@9l_h4%a58FKy7+6l&v+P-~}aOwixv0K>JhC z6P{jPURRgP9VhTE+_)DawzsCSGak!z^3=3Bx1A}|l(3bZ{N=58iy?<7cVTldp1);nC2^{)z&NFS< zj~<<+5%YFe)sWHITpE4(^eO!f$8p?+(c1I`PD7Px%2sqz(2UoH94zF#?U*Y zIYLrmuU=!>yeZ;Yj&?y9{ppF|>JEHt{!Dkm5$%433 z->cM%yZ>MmtT+Ae(Dbz;CyO{y2fl9~(d{5C0t+xjqTza66^1j6nZ=u|{_2dlcxTSl zoovI%*(3^+oUu`q&@+B*$Pp`ZixCSal8Ld}NO6JYBv*z-c?}5)o05-%a#oSOgpf}A z?X2QFTL~c*1=$H~k{=KK*F0HDR#_c!2cxhW>`u@~d6FqF(D<`AQ)I8l51u@AN)f1q zyR3v~_2WU0c#*&bW-Qo{KRo(rgL)+%BO#A0!YA8RQc6l4yw->`+NdDQ)rcj^y?)d4P5Os8Oh)Liu5%P$DO6&?xq(Q7leo6WZ>C zr^LTlgGRJn>`|kX2F@%4XrUf7;FbGh5o{?QF4VRn_HA=`DYhu1XlS-8kpz`RSl5oy zLg4-TSrS;dRY%gPQlhUngO@5EHBvRBR?mkTNtp#1fJVEQ4n??|<^KxCJLFIQuNE9M z$~tPqT1a?R8C z@Ao-4XpUk2dBJVAi{%DT-G#xDa6Dpqx;x>A?_d)`l-#)Yjf6w5SfMd)zTVttYb-b} zw|Delf780E`=y$^d0PrUTkp-OTL`+P91HK|XF|b+<{#yjD;8nU1e7ee3qr6q#{*9i zzIyrcWxI5;^LQ$<=9%EAcWeT?u9U_Ll|p*{^loZS1NS*STVZ1Ruey$ij{!bjr=ZzX zYIR;-5^ZwbUYY7E4q6*w%C<8bDMoZ_%%JjqmhdH%8RnFQMa(p!*-y+6Q-AQzqNX2; zyp3BlZ=Q9zu!mC(-DKOitDSG4=(X{^WpA96K~Nc;Lhg?&mSc40`avDTH>OYNg)nYx zw9_n9_y}p{<#obJn^Re7=7@e31O;cK-HP6AR$@fWpjViy!DnsdL*-CxuuI`Cj?V@I zT2H(TxBpU*T_}Nm5i(#=KQTIo$;A!g<#pdhE>*3bT^OkrPRXwJ-Mdl!bFp&mUF}{Z zt7?i&LCwxJpS4c;wV~1d1mD%v(T;DO&ws*$2HFS^RJs~3Z${d@Kk%JtyI?!o9L9Hl z@*K3sx3uhN8pSJw;Nn)x4w|=J2DJp4%-$Sr4JSNtquR-Lvs>?a z!l}8s2)U{{kPpN5s+OB*JGXXWy!#@&t&W^VRYE&%6RWH3;!8gTpQib43|Rey9}GOQ zs;#K3d~W`kp*=9UhF-w#vxZ-6Peptrq-jOVU)_aqyV^o03$PG-2;bgM^Ir6}jbW6X zT&ChXol&RP^R6##eM!3R%qr@=#q9zYxC)Q;$V#i7HsIlHLChffwl9UY-i+r~(!|Z` zXM1gU8)m!c0z6w(Tl|)&jAxqPV)@Jtf=UdzO>Mc_s=P~0y=d6SvwPiXQlZu>E%d?O ziqB#zS8W8J%1UCwWMbpw-VL#vgFaz%qOkLgvq+BaMoX|?oHfoy#Y;n_!p zYK*pUfto6o9P#a4>)uT|d+%+{s&^Ai?=(kOJU)t6BS&j$xIz&9m?{x;`2~jH_ECP@ zzT(}kWEU~Ti6UcIg!Pf_V`GD3L?3(%HLlI>-!6lX!HSBBqCS$_I(FK5U*4ms6oI8a zxnxJ_=go8ZD!jExGfTXR6xG6yYC&FE4tMFhF|d`QONClCe{9xAkiYfLTTIN?)U6s% zUGFZWd#&WC7QO7yoAl3nRjfwTIF`?+ObRw_eZTnyzdf$0e~!iWsR476K+Y3>URo~<1MvlHZioBDgm&uI3Jtf08E9f5?5KM04|w>z0m{JgLUJB^`3Tab(k%u+4Rdx^h50F z3goCS9}B8C^u+y|9yQwa$>Q*$WH}wj7-CD%bx+iE_qKQD3pP{N6~lD*m!3%ncU5_; zW~N_8(ff|E@a64nOhk#_+#^e_a+scSoa=e*J7Mi7skl#fEs|~b?254TtdFwIWl|JE ze87t1b@-4{{;DF(Hi18-Y=2V^{13<4kkE^H+9rZmw0|zEx9E&w;9dezXN*h(c{_iOH&0^BDu~J4;r46Wr4dfaoboDi^?s05~hs&Xz7Cm@h z!{OJr(IMqc7NNST2C_HWlwr31wC+G(mtPJ|C=)(zJyXn!(m5P6;iqj}1>f$88!oP{ z8(wc4*q561cvCkl;5j8;y0-9bIGr(ZgRKrm@QyR@mqK&=z4n7$wKeVxU2WU($abuc zjk&Y3`;QwxQt0v$!cs@A-dc0OCn^Ib*R8ZhQ!Tld=^v$!F7xL)cBVeTjxP?rFuWi)`TXd4@>=$d9`Nb+CFY&p}A1Y@R?$>K9MU;-TU8ztZ2#^b>Ke? z=d<(bLzi?&{NAMaC0O}Rzc^oDs;#YE>}@hsYG3{n-87%}g^00y6z-iYy^G9yI>@K? z*hxjZz{tl&@I;$fjct?P{)}JO<#cbd^^*s2EtPcEZoCR!N))YU!VJdWi?iD2AqM%Q z`?nq2KmLrJz2w$wT@o(uBzOW9d@m&_;tc?@CPJue`j`toc>B)$Y1{viQ4^8Tix_ml*n zQ`Ql9s{4K!J49D}{zaG`^ol!erUtY)5L&Z|J%el{>(@X;HLPI1s1=`XoE%z zWZ?gcHP8W#ULQ45{4VuL6Iv(*yJ$kNQ0Yetl}}B#DM(Wr^yl*GCS|4UeV&UqMfLL*!Ug1)m#M$<_ATgNj%4B*9F`bZvh>x(_ zqQTs^Z~kxd9LevRdU<+&YX~Lp73o~nto0Au^rPLk9=iRjG}1-$>a4{O70{22StGd!#c z0;^}2)t*ic+7jWNrBfikd@~F1LEY~k5S9eXZ-_PMTq&fXzqh?&x$}WxUn1RS;cZ0Mg95DdK#w^UTe7Vg|E2 zEO*Q&j1PAD*IF*8cZ5;0eVY+K@K}2@$*}tsza(^v;b2RCZEit)e>ticIV$G4J(W1S zw>ip1Ir>I3=UZLCiDJ6}o)lp>PM3T4I>3yTBSV9Lpu$MY{0_v{*VZ~h$uC6R@YrGpg1Tk)D^1a2j7P zeIn{5u=gWaJZp2rt3V4!Ae@G9sNdKxZGWe~w(GUV%bvSSBh|{QGwm;zCq8yRx**JG z(u?beMQ}&i|G`3q%ltP$Y~B0*8AiizbEo7itU?>Sx%!&6Oa0AsF;TLF)oDylo1)ny zunh7zJAeRWN*8OmqLei)C&K)*z;7?yce8S|SETFZho8L#zOth~M>czSi>qWzk4Qeb zB`3K$#*Rxk$2=bySHOFG+%v#|u1U$506y&=7+op)6V0TEu&`MJf#>d4;j7b!Z)lS9 z4%%wu@|6@sj;xu<34}hjvi94ZVCarvmT$1N_CVAFG9oh_whVmkD{*WiJU)wN687t_ z{9X@IU2L!$y463_>5qNl)w_4^79?$UZS3q>$3GQd=(5b0bJ@l3G>Xq`?~GaE?7mI0 z*kdm!PvbVl0j85ynb4a!dN>4PoI`m1Q?z^=L?SK*Y8d z&Lpl9K@9XT6Q2?8?3tlxmf*(rHT}zcv2DNx#Z)%lF8QScsY>1Sn3Sg`ppZ_KU|a=-LL-&XJE!HDj7N}s@ z`NdOarHhm{8r~`4?*XCXrdMoDnkMFRgSSE#1@8=I@Ks=ze`J>&a5!9n-wjt`A#2wJ zABV9+3`fXs=wrp=Q%3l_(KCTYtBK6JfJjQY;bKDpYp_c_Z8Z=XDfX65{n=QShr+_? zlL0}%gk56+?^mxfA_6c=v-}OAme=jC)bv%`)2YCy3{%J5scS-YKy$q`btL!)k8}8l zU#G<}dIYgNHmffX_1d_ltxat|R7!-z$|-Xw4enpV{t54_aGLt`YFdOXb;C6EBq3EtjnB`W zhB+_+1SW+)=I+$NsNHfCG3iS1f$;T-oFfIFpoQG#!bPB9qECE&;K1gk;|EEe|C$NU zkrIQMIN=Fkh{L;r@QF9~fRW4T~&7Jzcf_lZ}(l zd77p+&rW>zhqPXmyCVZfDlsF%%ub{Hn)7pvCJ%3GN%`F|sq`d%9QT>Fw3sA*Gk)8q zS_O`5uoTtfpok!nAgY$qk3+f{=B#xo|kOdL@Qtyl8|Ch>svjAwlhH2Ky07h zP%aChy859S*Z!p%cN zuI_i?t44T;&Fyb8mBSa{CVlUxL5$1A98!=R$?$SJupt7P)0~kY^>Xs+lA7O+#wfKS zdGL02R&%bWu#@6XsiDr!YX zV>a175JWk45f(Qgy9C63CQcXhj$$IqDl03awEFa0!K@{WbELzjQ@&Vj47-gkc)bcI zw<}4N1kBI8`kgb1tI>nKZxr}XHT8tKJ>QBt*ovyL|GYIi>icuyTVl$==D~hCYGFXn zR4Kn5J~Zi+bPXnr9()$Q+JE*ViCjPu(X%irrw$_ubZ)Y)o=NGQu0@VF%c%mqt%8_- zBQK71E5xH11|H9uG&k!XU+aD1(2)^VKhYX%c_cPw#kWqsl)istt-3RNddf*r-ixDE z9;hV|-kA%*7*yKsO2lL$1&XdEH~lH_TmTZ>D4H?ka(}qLHrq{cpiWUc-B9aZ#BEVo zySIQ`0~tlRVvy<^eD@{vTTD!YT zbb@erE5BgdsMD_04H`3nESrSp#$H*;2|-LBdW*&C2fF=GAMc1Qv`|iA8yOY%VinIn^?iRRxuBrucn>paJjmKz_Eo7tm4(&%$)22n`ss!DvTq@-=q{X9#Tua32M| z-<~hS;&&p3=|49sJ0t6KyJHcDu|R-6rn5~Pl#dUEC#r_ywf@b8@ znZPNJubt!xDjvSxg)7)#x1Ha#t^d^Y3bO?Ip?b?>4{NT|%c*B8+lF)**+c+xu~($q zJL~q(zPv!ub=i5peCBC5{r)6J@BY%kK3B>qOPDnrjw&@!Zu6%~OO9-hb0Tto0@0I^ zBexPaSl{!(XxlHB^C~;B3N5y?KjTIgE0d$>G@Rh)%}RF%0$1OOe7GeC;)v|WEUO&` z6nc5mwwn%kyQ`K?O~JP*bm1n_cN5uzRzL9jd=>djg{=VXw(Hv3g^i8r9$0a1_^|n& z$RySL^jwsWmy6F)Et33-GL-i1T3I|o6 zGO&^s{>Rs&RU-^ng3j*N-5IP^l zhZ<~G!=>p@%x)-pc$^bgudFId+1i{efEmzI#lshD4A5}#)S2<@;Enss7nZtl|)eg`uyO3e8gmJ>^Jr*OpM->Kq>E|yu07aWLI4FX1|GxnU~jXfs^pq)m1?br zWBI<9Q9i;TQ*>++)D;#%LsBZp5C_zr@m9isxqgIT?>-c{omis6>(pXD~bvF6jTJ!LG9l!C=x|bd^T?!lTw!etQi25>H)b+-BFL z+Moko72b7U_9c|Z`dqKITxopL)WrD2vQu=bAhJt%sfv67`DDGN^#k4Ik{oG!k`n;7 z`2mREN$S(TGBPq^^c4#mBP&@+D>2+)rzOJP(LFMeZ#v<1`52%txybG^k}v_J3>>=7 z&7@?GCXTY_0G}^7U}=Wy(zad@lB1dhcG74qR>+n2M`dI79(&1ZDqbdj0Qae{yF{pb z*`mNC4k?a0^J40g7|<(BS0D6h%6*527})wk|7`LaM%re^S(Q|n;Jy+F1YX7W&YXnh zSW!)q9)d9hv43(Ror00C$?1L@%y*Dc$;5v&&Y&7mBPf5RTnSjKZ6oalVw{U)b=$ON zn&DHpF#QPqyYhzt6RW*Fr`y-S74`y;SjvXnQ4Y=pw%2K+d?ca-_Z7j*l3X|*Q#RO< z+F;XbOlD^IMB32^M2_<5LqjahP2{!)D#3s3A2utPd`Spm0G=nw(PIa3nc0^>VI{BI zS5{~St~KOhq>_mCw*!hmP`p8uXKBv+!ZqqR;8@5%u?u3lNdOE}+h1L!B0;IXzIXE} zfJe#w&8#1w$f#85U2n<>p_ZYV2HaXe}VlqdE###Cp!c0wubkphK?_wff*N94MxK zP%Nq&UL~hBA&AKF*_P~7w>4v*d(QdsNOFdTb3sBNwyFV>#LaQfBIL%zWO-(1Z$_-h~9HA0hU;FJ6On%t1?~fpc z4zNW+4*L7s0i#1a?i0N2w<-oolwN>mcLQ+sTSPD9w=a@sT>F&MxW?f5E0QoaK+fkk z_oEBs-cIFd4x_AyU0hr`OYMht7EVVe6g3sNV(hf&;C_Q3qr92=U}|6xkcSHhH|J_N z%ojfw2008@$S&0$_~wgKRe_X$oqCXgIyY9p4hgsNnS4Ou?w+JOqCF_6P%Zecx=Kqv zeaInwH3+hBzJ(rz7JG)|=C>JKu0QfC`uU5eae9r-#j&*<a$?RKB7wWuSITg9S0SVLKN zGC2y+)T$5V_IIUZtRyJ%ZD*fChgex1tQYuoF8OW>J6@PK+sZNC3#-|zUJ8XC-xu} z^7y~_Y8{S<(4c}mS&3`j1JSM3JupY{!xxwr}nx22KDzJW&!;!oX^aa;v&F*jf{ z-nxoyq*vFP4n#?nH_rfwwCsKEGGjob?Y+^q?6kp6)kWR_RRF%Iw;~!|0POd;ywnY_ z-Bq$j87ZgYb1CC0?@dQ84UKv{+=x{Zdq&Bo)zR*^ziMr-m*#ri1iQ7CU>7WDme0?P zPJpO$pT?;6-A|;W1ND7dR_Jo)8FhJi{QG&x$Z+?di*-1qFJA`Vd?G~3aYC=+-qi#u zTn)p@Pzm(l)a-(_UOn9Rjd78M;w5X{JGlnskKOUHF@fHZ#+Z}=rg^tm<;yBCewgPF z*7<-{nnCg1G2*oWt8`gn&Arw1gIv`xs9xuJaIf!9cX}7Zb}iEkRN*n3hV{LNnC)z(ALdGn3PU;Bu==74(Tf{DnJ})m?EqzrZ&kwA@4qPWv zB8?C6cuta!cRJD7ci`P{5`suI!um4EY#sgtY>@dU*>f!odOEXw=JSorOFnN@?ddXS z>l~gtY_EAvHKK%r8wW5$Q2PK0;Dzz@bnNwL>Jv7*utz#Ga&p3f36X;swDVz2NGEuL zo4OFt(lr^cU0EUzF4b3$BVFx2gTg?Nq69y2z{Kf4GUk@ImC43r@%zTw!l~JHNERfM zHj+WTheqqku%^7w!dJv}fOtD%{BK1790_x%zo04ec9|A6PHeP1@+3ujfJX+bbRGt$ z9O617KrP;3^Jic_L?uO^s)_?6{XWeE7ohvJrt8^!uh@3KP&HeE2rNe|9BFOelh5iw z_T^BJG-?3FEpz-pV$syI4y3Rl^K$F+mvahBbhRKRCF8>UKW750iQ7vUgzhq`J`sv> z7as>OYkKfqHx?4ByE}hHRrOVH4gE8^+m^-;-V=Cu=a@nzwAd$b`2sO^=KP*(-=K}A z?*)pUdJ}XG2{lR=DC9{g?90`a1_VmDjj;1H`b%{nzd5b`BE@`I}{)M0OQO1dCI;HHTO{7s zu+ivD7!!_OeZmG6_pE;Hcr*X+S+wN{_9Yp|vG)&@WbAm(E`}BWq66s|S(aPqM$e93G~W z+RP_)+kF0-T&k~O1i#PDnu1PSs$hZrA}C^|KlKf`%y$^8uFiiH;L2IS?oYcPr_Cz7 zw~KD@_ee+P!tmo}bDAV%6z}pc>eBS*l40-){|`4n#o9^92S4y*9iq` z&q2gKr!Fh%5%#t2R_VQpWQ!Uq=2Q=m>5 z6vke?iM6Nx#L!w^3jI*4GjO}?h)yOnQxHWT@#9^SDHJ)oqsXddh}OOC>2$$NOG(sQ z7-6iq@c#0{Gc33rTx3d^w*g7^a%s+}dq=~VX3gckJEcvU$**Cbzif$D<&cngF3Iv_ zRnOPHJpDZ*k0+F``U>*y8*Z0S)^bfKTvuN3ZlQJ5QU=4}Fiw{XPFjDhN7-~3Qvqud z`ssKu(=^87!=0Uyz%fL^Ep;bXa#S#WGu!<;7+SR*H*MeSVa;`P^PGf;%7k-o;#m`{d}zF0ar=YZVx&Lg~8Z58WT=#eJVtR8)kFPBQ&^sx|WL z^n+7>WCsvy-#Rn#YtIno8S9_<7t0Ki(_;!cE3BJ9_3}HqYlEkCbw{G&PVx~lwtNge z$Kug5Am{8Hf~@8TnK;j%3-4x2`i-7jJ@t49$`&L*k=Q88L`X=4B%-VK-}ka-CdsLCn1A%wW0m z%WKw$iCJEA4CdnglpfBvM4Rm$z8ej>YQ0jqjJIIe z+JeC^w)4s&N@$Isa+L)#8Ht+&8OBdc3bHjq2J{k6N(T7T;^aG=Rb8EbQL$JB)uTHn zo)YN~1>?QhdzY55AyLg0WFnflV_Z9Zoj3y5V64Ogzw;P-Fm zy&IWx+p1iuVcWs6rmy%?=~l3n7?tVRw^#OJO?i0!R`3?c=-oQmfQ7?<@$1|)Ns%!X z1H07r>U1g+sv}p=A%e{>s@`1?+tWd>1izDAOl>0TS;QL_OoSdh5BWen?$0XQ1kMo=<=!!LPyhGlH z>|H94rBbE3~Lx$ELg(96|cW?6k6<9%KSLg2U1IRUz8 zUr;(kRX`HSzwL=S|O|K6pWTui})5;CG&l%+iAZv}TDY<-Ktrh0n&^KYIicP@G z>AGA>5J;%;)B(8YdrnL@b&*1$7yLz=vxRZ8Wr(yTIl{oX$>&p8E zbO*?%_PkPYQRZ#CqjKn#oD5woT1m9H_G*%&WJ6)oNAAMZ!ol)=EujA|^Q4EruQu2@ z!TF6)Wq`d^bi1veXqVc>#d-ecIIUS4??B!X2-+!rK1}S-qA>r1G8?N6! zOQBG}MBLV#6});=$YKAT;D|f(PI8j?^o-e4({41nsWJC_K`&3hR)oEGAJ_b-Jv6pH_%ALG9}r zkj(};;xR>uFN?X7-J7-4QsDs7s4A7O@!CeA^j~c&MS5^F;2$TC}y+SBs?S8(79m!F zWu*AG#>(?Q+KAcZFpI>?>&;af^`K4@vA46{>44`5v&AhMz|_6%->;0*B^ADE1q#m3 z&D~QO5koBxE;~?FP49rSADz<1)8S_ixC%Z_7nW@(3eVEFyNqW>W?$XQoa&PC3K?M4 zx^O*60`JHg+UuQwteh>4_+%;o7lCcuKun#4AjI&&H5jH#nSO`hxD4E9K4LeTtAX7! zgCBxg1c3gy2ph6V4mjUo_x`OM%iBHIGy_-P$`uTjDsm-WFv0&l!AebT{yUW6w zGOexi$ON4QonJbE7aGUp?|bzD*Q+2HFYTS{F=s%u1gugAU+vVJ$8yYDjlhvYB< z%oO-0-CPR2qbn#wgcDEF@r6#0gZJyy$=ydDzEYziX`|OnB8^i+E1}TnKXNc3X^Ac zm1z9p-KcNsBYIJ#s%5bTyA~!~_p)MevVf7Pk3w5UBb3K?gz-3{G+pz2pE%{K}`Fb_|rD zC9rll+j3q9_5CY|{Ue#;bK@T**-PKH{VD}qM*p2G4(0FGn`E9VAr|g?ikMTnI`ryoe6EejE?4bV^jC~Bt-y91F?f-lpsv_p1P-= z1SJ_y-r_HD9VaDKdIkF}hkj|t=R$KrOqBe@A}kymvc@y3$YlF1ON4h#&kI1LnmLXP@N012u-p5j!1 zgd+q=@^{bD3PgZ%B-IbW#9U{I#ZWr&B)vfAElw5T(`9 zg2lx}^fI6`IR|?sCbXYK)J6C2i23d&f%2-8ecV^2On_kctUDOT@o`thUdhv6+#MzX z!+CWaEFKQ0Bji)=`OjOmsELcx4<{WuvzOU!%9*%NG!dnM^mzgefes}MCVtZRIOY__ zJsgot)&iRZVLG5kw)o{9GBUD$Rk{NrLldn$J=rLF(agP{o8i~%Z^@Yq6j^pACJ$G- zwVss_ZFrJmr;}BXg3dWrE{zs=_Nkc^_dYIPW>K#L9tw^LGs@`b?Ue<1xOF%aM6gL= zpCbBg+LC#L1suM-x^cE?0Jqd(SP2wFQsl*}J__{AKot?h&9dDhN(2KbE0KjWW*iN~ z7HhcLD{;C#T@94yy#z;aP25hn%y_$D9pF~|;an~~(fTcB!hI}SA4-udyvqczp|9i2 zE+h)TNM1ACR-JBFK6@4vwC?gw1JwQc`STO+weF_8?f5o3`wWz0%Cz!>;(<4MdeKuj z>m+r=pR?Z7oIa;(t^xd>-E52yfrx5G$g9bB{*d!VaxV~)Z`CpR=DcALzu$1(duR6L zS|hb_2T-6KCrWe~IOdu?lkWG_2pnmCMSY3bOEFenG%M>pDyOL6{qx@M5rA+r^s^ww z*(0!)WkJ4c5NBZ!_2eVtW*4CXRMwtF`w+XLxL$3Sqv;WcMRF88N1TzAP?2E1#-i^W zNq1d+QXgzn#)xAEN*XXwuxz)<)Uj_O4I~+Z{k87As6MH((^uerMX&bCrDLLPO*I56V8+3R{^rKk&g_aezH{M- zw)DeEN?xyh*o=jnOM1A#C3t5~fLsh{DFpbr`7@$)K@wngGL|E>b?&X4B3N3rG|Ws8 z2S^YJ-fT@NE5>*$&|eM>FCW9NYkG7+8ARt~@@5|jKA%5xROK58YWjXTF%#)KaQlJY zYdo~Rt(K3TA2sl10dKOMA`v9GBT@J8Rn@&&vgPl&YOQC^GKi^w0=aurpC~<7CPQ6{ zPT-%-0!64~OKWdI(s+H#B}y$VdfdNa=F!%t_0mjAlhZiKkb9;(bkBTdrT<78HCXWb zHU^z0>OW@IHa?|+LwiK@B0BC_Un1Ud1ENjk(ux&2NfIPGC>RVjw;DnzxO2T0L!w@( zAgQfS(c$2{hMs*6Jo`aIuBu&r1AF@$D02c>ziXt0igMl)AYXJ?^vWl#zqw_%A>ot@ z4Q)qTWoSrq<7|@yJ>X8Jd+E*xNo=U`pTLU_&wFVYIsh!5{ClU7Di8blu;0p8%f;sD zjU8}U&dfa(9`~v!OBvzpq!FUPeF|1H`~_Hl>x<9AYq7A-Fhbu8@E!dwNVS)J zay);u2cB(12I9BZ*pVAiBaz=$YHicWMP9?8}#fN5inrsEYT;Tl-13?nv zI4;Kc)|Cb>wPXFFVnge7Xgjgn2sMR;7123%gY90~Q}Z1l!}d_?_T&j17J{C=QwwCT zv+3vNn%LICq2~vL4R*dP*`gOqS~p*z0Lwznk}G|b|B4|dh`V%avzk}=MgP)WZ9${g z#;?;yqyM}Q7B&n!RnW+ndGH|-tu?TDd`^?i2{45{rG-nUv`Nz&khf`5%Wch~cj5;T z-pY2_zS*v1=`^$uXm~Fm0z$vBUW)Tz>kyp!T(zuqk!qekoy7SfFX)5wU+W`0P>K_Q&Q0x^mI@n&9~#_YE2n6RnbKZJi5NZ<1RIU5bi# ziWwY;P-QN)|Jmq{VFh0j@O_8bi^Q4_8$&euKquGBTT>tk^M$_z62}1i63|v>%5?kM za|Hun0!RBJk~O1z%og`H{T-m27r=SHS|uF~;j7NC4UM?04>&=W?wxj&+ms*|=dP$7 zP!rRB>H(;NnK7e$*#`8x2lZ=UZ?G$x;j51AFG#7aT*(O~EggdnHx#^RCcu@DP>^t* zc#uRXRbuhtH3pm{mqylXvvTMb-G8ByymALOk<%~}P+eUhuLqUraWKb$@g{T8xEOWM zkB`YI+XtFTFhX`i4ze5U*pZBdrxd}GSn-yAYvMM+THn|hq}SqqDu73o3#vu3f!~uY zxFEpbTm56aF?<&MdoA_uTf_@iF>g}!c={&b*0EqYat}`cmnC&EgYr_6p{?;0e+le% zHijD(AgyFpA(< zI&AHBZww)8Rl(U&nn+r~nMe~d6>u@e0StKW z2B94CA7RAvVnpW&IYEan8Bh@}^i?7tU({KF24@?Dyv#;qA*FaB;Nn;J ziS_bT>ep$Q&+hCXRGA4_-i4~ywW~=uz?m0WoI%_UHVTL;cFE0A8F0Wxt(+^HouC;XQ3zys(uG z`0_BLdtwLx={idbRU)8TzXMqD-i|=>6>+&0n9o9HB^%mrD(0Jf>kX?Nit~-)453%)x zbmM_q%uU%PF@vyGz5}{ZRJ$1M0!ClfyVQ$nfE0_H(U z@zvZ?8mU?5RBD=^an9!fYWo655O=F4_!a<)JnVz5iKx5+{CC5sKkOpXO9GOL(D<9C zpC@5HrOOUXV^R^|)Wvurr9!guLJ?eSVm?*)#*HTh$^6Ph;LJYrlck!UoKUHzr77*gsiO3Fi;}BDk@K7RIW^NjSDMO$2!Vb;)^1#L)G_cfR%jI*@D0|R3K?geMJcg%k9rPU?b6!W^(P6UY*#*vr zyvwcR;IvF>J#-J1JZHKd#e)Zzhqad)|3U6we)zZ}0tc+1q*Kh@NJ2eKiZM~*8=B@L z&obnFXh_CU3)KIt#&f>A#ol^pB=VCoM}J7ZCB_t5$Eh`Kc-8u@4&y!kF0Vdw|6e!YN{ z2^X9&3iu7fg#50{1hj~u0)We2`F3IAON>Dz)_4eaX+zstKo@O)r|X+!_M;FYSh}@ zLo9kHf&;Mtr*~Kya3%nRh4SxLz+pf8dz|-cx(01?@3ciw?Z!wXnt@OO?N5QEt z-!kboIy)##Wtb+pzz}GRlz&6|O<<`9p9Qi(+Je}fmNJA$?vw==6bwjSjJUgE^y>FVdQ&MBb@0DXZUMgRZ+ literal 0 HcmV?d00001 diff --git a/images/tma-l1.png b/images/tma-l1.png new file mode 100644 index 0000000000000000000000000000000000000000..f957f853cb0e985a30a62d450c6daedddf6d570d GIT binary patch literal 24014 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 literal 0 HcmV?d00001 From e4d79edc555350cbbdb4efac2a11fa6df35db165 Mon Sep 17 00:00:00 2001 From: beeman Date: Wed, 9 Oct 2024 14:37:21 -0700 Subject: [PATCH 08/13] fix image paths, author --- header.adoc | 6 +++--- images/tma-full.png | Bin 27122 -> 0 bytes images/tma-full.svg | 4 ++++ images/tma-l1.png | Bin 24014 -> 0 bytes images/tma-l1.svg | 4 ++++ 5 files changed, 11 insertions(+), 3 deletions(-) delete mode 100644 images/tma-full.png create mode 100644 images/tma-full.svg delete mode 100644 images/tma-l1.png create mode 100644 images/tma-l1.svg diff --git a/header.adoc b/header.adoc index 164de2a..ecc2a23 100644 --- a/header.adoc +++ b/header.adoc @@ -1,5 +1,5 @@ = RISC-V Hart Performance Events -Authors: Author 1, Author 2 +Authors: RISC-V Performance Events TG :docgroup: RISC-V Performance Events TG :description: RISC-V Hart Performance Events :company: RISC-V.org @@ -12,8 +12,8 @@ Authors: Author 1, Author 2 :preface-title: Preamble :colophon: :appendix-caption: Appendix -:imagesdir: docs-resources/images -:title-logo-image: image:risc-v_logo.png[pdfwidth=3.25in,align=center] +:imagesdir: +:title-logo-image: image:docs-resources/images/risc-v_logo.png[pdfwidth=3.25in,align=center] // Settings: :experimental: :reproducible: diff --git a/images/tma-full.png b/images/tma-full.png deleted file mode 100644 index b4e634de44695292d2157cc2a7ad94c6fa089593..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27122 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 diff --git a/images/tma-full.svg b/images/tma-full.svg new file mode 100644 index 0000000..9124a5a --- /dev/null +++ b/images/tma-full.svg @@ -0,0 +1,4 @@ + + + +
Retiring
Bad Speculation
Backend Bound
Frontend Bound
Core Bound
Memory Bound
Serialization
Address
Data
TLB L1
TLB L2
DL1
L2
L3
Misprediction
Memory Ordering
\ No newline at end of file diff --git a/images/tma-l1.png b/images/tma-l1.png deleted file mode 100644 index f957f853cb0e985a30a62d450c6daedddf6d570d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24014 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 diff --git a/images/tma-l1.svg b/images/tma-l1.svg new file mode 100644 index 0000000..767f6e3 --- /dev/null +++ b/images/tma-l1.svg @@ -0,0 +1,4 @@ + + + +
Yes
Yes
Yes
Yes
Uop Retired?
Uop Retired?
Retiring
Retiring
Yes
Yes
No
No
Backend Stall?
Backend Stall?
Backend Bound
Backend Bound
Frontend Bound
Frontend Bound
No
No
Uop Issued?
Uop Issued?
No
No
Bad Speculation
Bad Speculation
\ No newline at end of file From a74dc1735c4a0ad0b4700438ad9c22df934e0660 Mon Sep 17 00:00:00 2001 From: beeman Date: Wed, 9 Oct 2024 14:37:56 -0700 Subject: [PATCH 09/13] switch from png to svg for line drawings, tweak text --- body.adoc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/body.adoc b/body.adoc index 81509e0..f194ed0 100644 --- a/body.adoc +++ b/body.adoc @@ -79,10 +79,11 @@ This group contains events and metrics related for Topdown Microarchitecture Ana TMA allows even developers with minimal microarchitecture knowledge to understand, for a given workload, where bottlenecks reside. It does so by accounting for the utilization of each pipeline "slot" in the microarchitecture. When the hardware is utilized with optimal efficiency, each slot is occupied by an instruction or micro-operation (a.k.a., uop) that will go on to execute and retire. When bottlenecks occur, due perhaps to a cache miss, branch misprediction, or any number of other microarchitectural conditions, some slots may be either unused or thrown away, which results in inefficiency and ultimately reduced performance. TMA is able to identify these wasted slots, and the stalls, clears, misses, or other events which caused them. This enables developers to make informed decisions when tuning their code. -TMA accomplishes this by defining a set of hierarchical states into which each slot falls, based on the boundary between the frontend (instruction fetch and decode) and the backend (instruction execution and retire) of the processor. Each cycle, the frontend can issue some implementation-defined number _N_ instructions/uops to the backend, hence there are _N_ issue slots to be categorized per cycle. At the top level, issue slots fall into one of states depicted in the figure below. +TMA accomplishes this by defining a set of hierarchical states into which each slot falls, based on the boundary between the frontend (instruction fetch and decode) and the backend (instruction execution and retire) of the processor. Each cycle, the frontend can issue some implementation-defined number (_N_) of instructions/uops to the backend, hence there are _N_ issue slots to be categorized per cycle. At the top level of the TMA hierarchy, issue slots fall into one of states depicted in the figure below. +[align="center"] .Topdown Level 1 -image::images/tma-l1.png[TMA Level 1] +image::images/tma-l1.svg[TMA Level 1] * Frontend Bound - The frontend did not issue a uop to the backend for execution. Example causes include stalls that result from cache or TLB misses during instruction fetch. * Backend Bound - The backend could not consume an uop from the frontend. Example causes include backpressure that results from cache or TLB misses on data (load/store) accesses, or from oversubscribed execution units. @@ -91,8 +92,9 @@ image::images/tma-l1.png[TMA Level 1] Many of the top-level states listed above include further breakdown at the 2nd and 3rd levels of the TMA hierarchy. See details in the figure below. +[align="center"] .Topdown Hierarchy -image::images/tma-full.png[TMA Hierarchy] +image::images/tma-full.svg[TMA Hierarchy] [NOTE] ==== From e8e1ebff205385b6bb6434a8c39be3103dceac33 Mon Sep 17 00:00:00 2001 From: beeman Date: Thu, 10 Oct 2024 10:48:14 -0700 Subject: [PATCH 10/13] minor text improvements --- body.adoc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/body.adoc b/body.adoc index f194ed0..387d66b 100644 --- a/body.adoc +++ b/body.adoc @@ -77,20 +77,20 @@ include::adoc_event_tables/tlb_spec_metrics.adoc[] This group contains events and metrics related for Topdown Microarchitecture Analysis (TMA) methodology. -TMA allows even developers with minimal microarchitecture knowledge to understand, for a given workload, where bottlenecks reside. It does so by accounting for the utilization of each pipeline "slot" in the microarchitecture. When the hardware is utilized with optimal efficiency, each slot is occupied by an instruction or micro-operation (a.k.a., uop) that will go on to execute and retire. When bottlenecks occur, due perhaps to a cache miss, branch misprediction, or any number of other microarchitectural conditions, some slots may be either unused or thrown away, which results in inefficiency and ultimately reduced performance. TMA is able to identify these wasted slots, and the stalls, clears, misses, or other events which caused them. This enables developers to make informed decisions when tuning their code. +TMA allows even developers with minimal microarchitecture knowledge to understand, for a given workload, where bottlenecks reside. It does so by accounting for the utilization of each pipeline "slot" in the microarchitecture. When the hardware is utilized with optimal efficiency, each slot is occupied by an instruction or micro-operation (uop) that will go on to execute and retire. When bottlenecks occur, due perhaps to a cache miss, branch misprediction, or any number of other microarchitectural conditions, some slots may be either unused or thrown away, which results in inefficiency and reduced performance. TMA is able to identify these wasted slots, and the stalls, clears, misses, or other events that cause them. This enables developers to make informed decisions when tuning their code. -TMA accomplishes this by defining a set of hierarchical states into which each slot falls, based on the boundary between the frontend (instruction fetch and decode) and the backend (instruction execution and retire) of the processor. Each cycle, the frontend can issue some implementation-defined number (_N_) of instructions/uops to the backend, hence there are _N_ issue slots to be categorized per cycle. At the top level of the TMA hierarchy, issue slots fall into one of states depicted in the figure below. +TMA accomplishes this by defining a set of hierarchical states into which each slot is categorized. Each cycle, the frontend of the processor (responsible for instruction fetch and decode) can issue some implementation-defined number (_N_) of instructions/uops to the backend (instruction execution and retire). Hence there are _N_ issue slots to be categorized per cycle. At the top level of the TMA hierarchy, issue slots are categorized as described below. [align="center"] .Topdown Level 1 image::images/tma-l1.svg[TMA Level 1] * Frontend Bound - The frontend did not issue a uop to the backend for execution. Example causes include stalls that result from cache or TLB misses during instruction fetch. -* Backend Bound - The backend could not consume an uop from the frontend. Example causes include backpressure that results from cache or TLB misses on data (load/store) accesses, or from oversubscribed execution units. +* Backend Bound - The backend could not consume a uop from the frontend. Example causes include backpressure that results from cache or TLB misses on data (load/store) accesses, or from oversubscribed execution units. * Bad Speculation - The uop was dropped, as a result of a pipeline clear. Example clears include branch/jump mispredictions, or memory ordering clears. This category also includes pipeline clear recovery cycles, during which issue slots go unfilled. * Retiring - The uop retired. Ideally the majority of slots fall into this state. -Many of the top-level states listed above include further breakdown at the 2nd and 3rd levels of the TMA hierarchy. See details in the figure below. +Many of the top-level states listed above include further breakdown at the 2nd and 3rd levels of the TMA hierarchy, as illustrated below. [align="center"] .Topdown Hierarchy @@ -98,11 +98,13 @@ image::images/tma-full.svg[TMA Hierarchy] [NOTE] ==== -_Some imprecision within the event hierarchy is allowed and even expected. The standard L2 and L3 events are unlikely to sum precisely to the parent L1 or L2 events, respectively, as it is expected that there are additional sources of bottlenecks beyond those represented by the standard events. The exception is the Backend Bound L2 events (Core Bound and Memory Bound), which ideally should sum to the Backend Bound event total._ +_Some imprecision within the event hierarchy is allowed and even expected. The standard L2 and L3 events may not sum precisely to the parent L1 or L2 events, respectively, as it is expected that there will be some additional sources of bottlenecks beyond those represented by the standard events. The exception is the Backend Bound L2 events (Core Bound and Memory Bound), which ideally should sum to the Backend Bound event total._ _Implementations may opt to add custom L2 or L3 events, to identify additional bottlenecks specific to the microarchitecture._ ==== +The events which follow count slots for each of the states listed above, while the metrics express the slots per state value as a percentage of total slots. + include::adoc_event_tables/topdown.adoc[] include::adoc_event_tables/topdown_metrics.adoc[] From f4a0d03e0a486bd121dcc6016f0b0c0be8777626 Mon Sep 17 00:00:00 2001 From: beeman Date: Thu, 10 Oct 2024 10:49:11 -0700 Subject: [PATCH 11/13] revise TMA diagrams to better match RV events --- images/tma-full.svg | 2 +- images/tma-l1.svg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/images/tma-full.svg b/images/tma-full.svg index 9124a5a..343d3ba 100644 --- a/images/tma-full.svg +++ b/images/tma-full.svg @@ -1,4 +1,4 @@ -
Retiring
Bad Speculation
Backend Bound
Frontend Bound
Core Bound
Memory Bound
Serialization
Address
Data
TLB L1
TLB L2
DL1
L2
L3
Misprediction
Memory Ordering
\ No newline at end of file +
Retiring
Bad Speculation
Backend Bound
Frontend Bound
Core Bound
Memory Bound
Serialization
Address
Data
TLB L1
TLB L2
L1
L2
L3
Misprediction
Memory Ordering
EXTMEM
PGWALK
\ No newline at end of file diff --git a/images/tma-l1.svg b/images/tma-l1.svg index 767f6e3..d7d682a 100644 --- a/images/tma-l1.svg +++ b/images/tma-l1.svg @@ -1,4 +1,4 @@ -
Yes
Yes
Yes
Yes
Uop Retired?
Uop Retired?
Retiring
Retiring
Yes
Yes
No
No
Backend Stall?
Backend Stall?
Backend Bound
Backend Bound
Frontend Bound
Frontend Bound
No
No
Uop Issued?
Uop Issued?
No
No
Bad Speculation
Bad Speculation
\ No newline at end of file +
Yes
Yes
Uop Retired?
Retiring
Yes
No
Backend Stall?
Backend Bound
Frontend Bound
No
Uop Issued?
No
Bad Speculation
\ No newline at end of file From 3a51b41461b1be06d261245dd24bb9a74cc83969 Mon Sep 17 00:00:00 2001 From: beeman Date: Thu, 10 Oct 2024 10:49:37 -0700 Subject: [PATCH 12/13] uprev docs-resources, which improves pdf appearance --- docs-resources | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-resources b/docs-resources index 8abc934..07b9904 160000 --- a/docs-resources +++ b/docs-resources @@ -1 +1 @@ -Subproject commit 8abc93401a61e52c460888ff658518a56e37ee9c +Subproject commit 07b9904bd4de7aca03257200a0f88cb2683d9790 From 9852a3e70086b91ef8391e766e7ac8902092488b Mon Sep 17 00:00:00 2001 From: beeman Date: Tue, 15 Oct 2024 11:17:12 -0700 Subject: [PATCH 13/13] add some clarifications to top-down event section header, including links to papers with background and usage --- body.adoc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/body.adoc b/body.adoc index 387d66b..0ff7bf9 100644 --- a/body.adoc +++ b/body.adoc @@ -73,11 +73,13 @@ include::adoc_event_tables/tlb_spec.adoc[] include::adoc_event_tables/tlb_spec_metrics.adoc[] -=== TOPDOWN +=== TOP-DOWN -This group contains events and metrics related for Topdown Microarchitecture Analysis (TMA) methodology. +This group contains events and metrics related for Top-down Microarchitecture Analysis (TMA) methodology. -TMA allows even developers with minimal microarchitecture knowledge to understand, for a given workload, where bottlenecks reside. It does so by accounting for the utilization of each pipeline "slot" in the microarchitecture. When the hardware is utilized with optimal efficiency, each slot is occupied by an instruction or micro-operation (uop) that will go on to execute and retire. When bottlenecks occur, due perhaps to a cache miss, branch misprediction, or any number of other microarchitectural conditions, some slots may be either unused or thrown away, which results in inefficiency and reduced performance. TMA is able to identify these wasted slots, and the stalls, clears, misses, or other events that cause them. This enables developers to make informed decisions when tuning their code. +TMA is an industry-standard methodology https://ieeexplore.ieee.org/document/6844459[introduced by Intel] in characterizing the performance of SPEC CPU2006 on Intel CPUs, and since used to characterize https://www.mdpi.com/2078-2489/14/10/554[HPC workloads], https://ieeexplore.ieee.org/abstract/document/9820717[GPU workloads], https://dl.acm.org/doi/10.1145/3369383[microarchitecture changes], https://ieeexplore.ieee.org/abstract/document/9579960[pre-silicon performance validation failures], and more. + +TMA allows even developers with minimal microarchitecture knowledge to understand, for a given workload, where bottlenecks reside. It does so by accounting for the utilization of each pipeline "slot" in the microarchitecture. As an example, for a 4-wide implementation, there are 4 slots to account for each cycle. When the hardware is utilized with optimal efficiency, each slot is occupied by an instruction or micro-operation (uop) that will go on to execute and retire. When bottlenecks occur, due perhaps to a cache miss, branch misprediction, or any number of other microarchitectural conditions, some slots may be either unused or thrown away, which results in inefficiency and reduced performance. TMA is able to identify these wasted slots, and the stalls, clears, misses, or other events that cause them. This enables developers to make informed decisions when tuning their code. TMA accomplishes this by defining a set of hierarchical states into which each slot is categorized. Each cycle, the frontend of the processor (responsible for instruction fetch and decode) can issue some implementation-defined number (_N_) of instructions/uops to the backend (instruction execution and retire). Hence there are _N_ issue slots to be categorized per cycle. At the top level of the TMA hierarchy, issue slots are categorized as described below. @@ -87,10 +89,10 @@ image::images/tma-l1.svg[TMA Level 1] * Frontend Bound - The frontend did not issue a uop to the backend for execution. Example causes include stalls that result from cache or TLB misses during instruction fetch. * Backend Bound - The backend could not consume a uop from the frontend. Example causes include backpressure that results from cache or TLB misses on data (load/store) accesses, or from oversubscribed execution units. -* Bad Speculation - The uop was dropped, as a result of a pipeline clear. Example clears include branch/jump mispredictions, or memory ordering clears. This category also includes pipeline clear recovery cycles, during which issue slots go unfilled. +* Bad Speculation - The uop was dropped, as a result of a pipeline clear. Example clears include branch/jump mispredictions, or memory ordering clears. This category also includes any pipeline clear recovery cycles during which issue slots go unfilled. * Retiring - The uop retired. Ideally the majority of slots fall into this state. -Many of the top-level states listed above include further breakdown at the 2nd and 3rd levels of the TMA hierarchy, as illustrated below. +Many of the top-level states listed above include further breakdown at the 2nd and 3rd levels of the TMA hierarchy, as illustrated below. [align="center"] .Topdown Hierarchy @@ -100,6 +102,8 @@ image::images/tma-full.svg[TMA Hierarchy] ==== _Some imprecision within the event hierarchy is allowed and even expected. The standard L2 and L3 events may not sum precisely to the parent L1 or L2 events, respectively, as it is expected that there will be some additional sources of bottlenecks beyond those represented by the standard events. The exception is the Backend Bound L2 events (Core Bound and Memory Bound), which ideally should sum to the Backend Bound event total._ +_Because of this possible imprecision, it is recommended that lower level TMA events are examined only when the parent event count or rate is higher than expected. This avoids spending time on misleading L2 or L3 events that may be implemented by imprecise event formulas rather than precise hardware events._ + _Implementations may opt to add custom L2 or L3 events, to identify additional bottlenecks specific to the microarchitecture._ ====