README.md
1| Supported Targets | ESP32 | ESP32-S2 | ESP32-S3 |
2| ----------------- | ----- | -------- | -------- |
3
4# Performance Monitor (`perfmon`) example
5
6(See the README.md file in the upper level 'examples' directory for more information about examples.)
7
8## Overview
9This example illustrates usage of `perfmon` APIs to monitor and profile functions.
10The example will calculate performance statistic for simple test function.
11The simple test function could be exchanged to one from the user.
12
13The example contain test function that will be executed with perfmon component and collect CPU statistic. The test function will be executed 200 times in each test case. The first test case collect statistic from all available performance counters, and second test just from defined in the list.
14
15## How to use example
16
17### Hardware Required
18
19Example should be able to run on any commonly available ESP32, ESP32-S2 or ESP32-S3 development board. `perfmon` component isn't supported on Espressif chips with RISC-V CPU architecture.
20
21### Build and Flash
22
23```
24idf.py build flash monitor
25```
26
27(To exit the serial monitor, type ``Ctrl-]``.)
28
29See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects.
30
31## Example Output
32
331. Example starts and calls the first test. This test calls the test function `exec_test_function` 200 times and collects all CPU performance metrics.
34
35 <details><summary>Example log output:</summary>
36
37 ```
38 I (288) example: Start
39 I (288) example: Start test with printing all available statistic
40 Value = 750, select = 0, mask = 0001. Counts cycles.
41 Amount of cycles
42 Value = 0, select = 1, mask = 0001. Overflow of counter.
43 Overflow counter
44 Value = 0, select = 2, mask = 0001. Successfully Retired Instructions.
45
46 JX instructions
47 Value = 0, select = 2, mask = 0002. Successfully Retired Instructions.
48
49 CALLXn instructions
50 Value = 3, select = 2, mask = 0004. Successfully Retired Instructions.
51
52 return instructions (RET, RETW, ...)
53 Value = 0, select = 2, mask = 0008. Successfully Retired Instructions.
54
55 supervisor return instructions (RFDE, RFE, RFI, RFWO, RFWU)
56 Value = 100, select = 2, mask = 0010. Successfully Retired Instructions.
57
58 Conditional branch instructions where execution
59 transfers to the target (aka. taken branch),
60 or loopgtz/loopnez instr where execution skips
61 the loop (aka. not-taken loop)
62 Value = 0, select = 2, mask = 0020. Successfully Retired Instructions.
63
64 J instr
65 Value = 1, select = 2, mask = 0040. Successfully Retired Instructions.
66
67 CALLn instr
68 Value = 0, select = 2, mask = 0080. Successfully Retired Instructions.
69
70 Conditional branch instr where execution
71 falls through (aka. not-taken branch)
72 Value = 0, select = 2, mask = 0100. Successfully Retired Instructions.
73
74 Loop instr where execution falls into loop (aka. taken loop)
75 Value = 0, select = 2, mask = 0400. Successfully Retired Instructions.
76
77 Last inst of loop and execution transfers
78 to LBEG (aka. loopback taken)
79 Value = 0, select = 2, mask = 0800. Successfully Retired Instructions.
80
81 Last inst of loop and execution falls
82 through to LEND (aka. loopback fallthrough)
83 Value = 309, select = 2, mask = 8000. Successfully Retired Instructions.
84
85 Non-branch instr (aka. non-CTI)
86 Value = 0, select = 3, mask = 0002. Data-related GlobalStall cycles.
87 Store buffer full stall
88 Value = 0, select = 3, mask = 0004. Data-related GlobalStall cycles.
89 Store buffer conflict stall
90 Value = 0, select = 3, mask = 0008. Data-related GlobalStall cycles.
91 Data Cache-miss stall (unused)
92 Value = 0, select = 3, mask = 0010. Data-related GlobalStall cycles.
93 Data RAM/ROM/XLMI busy stall
94 Value = 0, select = 3, mask = 0020. Data-related GlobalStall cycles.
95 Data inbound-PIF request stall (includes s32c1i)
96 Value = 0, select = 3, mask = 0040. Data-related GlobalStall cycles.
97 MHT lookup stall
98 Value = 0, select = 3, mask = 0080. Data-related GlobalStall cycles.
99 Uncached load stall (included in MHT lookup stall below)
100 Value = 0, select = 3, mask = 0100. Data-related GlobalStall cycles.
101 Bank-conflict stall
102 Value = 0, select = 4, mask = 0001. Instruction-related and Other Glob
103 alStall cycles.
104 ICache-miss stall
105 Value = 0, select = 4, mask = 0002. Instruction-related and Other Glob
106 alStall cycles.
107 Instruction RAM/ROM busy stall
108 Value = 0, select = 4, mask = 0004. Instruction-related and Other Glob
109 alStall cycles.
110 Instruction RAM inbound-PIF request stall
111 Value = 0, select = 4, mask = 0008. Instruction-related and Other Glob
112 alStall cycles.
113 TIE port stall
114 Value = 0, select = 4, mask = 0010. Instruction-related and Other Glob
115 alStall cycles.
116 External RunStall signal status
117 Value = 0, select = 4, mask = 0020. Instruction-related and Other Glob
118 alStall cycles.
119 Uncached fetch stall
120 Value = 1, select = 4, mask = 0040. Instruction-related and Other Glob
121 alStall cycles.
122 FastL32R stall
123 Value = 0, select = 4, mask = 0080. Instruction-related and Other Glob
124 alStall cycles.
125 Iterative multiply stall
126 Value = 0, select = 4, mask = 0100. Instruction-related and Other Glob
127 alStall cycles.
128 Iterative divide stall
129 Value = 0, select = 5, mask = 0001. Exceptions and Pipeline Replays.
130 Other Pipeline Replay (i.e. excludes cache miss etc.)
131 Value = 0, select = 5, mask = 0002. Exceptions and Pipeline Replays.
132 Level-1 interrupt
133 Value = 0, select = 5, mask = 0004. Exceptions and Pipeline Replays.
134 Greater-than-level-1 interrupt
135 Value = 0, select = 5, mask = 0008. Exceptions and Pipeline Replays.
136 Debug exception
137 Value = 0, select = 5, mask = 0010. Exceptions and Pipeline Replays.
138 NMI
139 Value = 0, select = 5, mask = 0020. Exceptions and Pipeline Replays.
140 Window exception
141 Value = 0, select = 5, mask = 0040. Exceptions and Pipeline Replays.
142 Allocate exception
143 Value = 0, select = 5, mask = 0080. Exceptions and Pipeline Replays.
144 Other exceptions
145 Value = 0, select = 5, mask = 0100. Exceptions and Pipeline Replays.
146 HW-corrected memory error
147 Value = 0, select = 6, mask = 0001. Hold and Other Bubble cycles.
148 Processor domain PSO bubble
149 Value = 0, select = 6, mask = 0004. Hold and Other Bubble cycles.
150 R hold caused by Data Cache miss(unused)
151 Value = 0, select = 6, mask = 0008. Hold and Other Bubble cycles.
152 R hold caused by Store release
153 Value = 0, select = 6, mask = 0010. Hold and Other Bubble cycles.
154 R hold caused by register dependency
155 Value = 0, select = 6, mask = 0020. Hold and Other Bubble cycles.
156 R hold caused by MEMW, EXTW or EXCW
157 Value = 0, select = 6, mask = 0040. Hold and Other Bubble cycles.
158 R hold caused by Halt instruction (TX only)
159 Value = 322, select = 6, mask = 0080. Hold and Other Bubble cycles.
160 CTI bubble (e.g. branch delay slot)
161 Value = 0, select = 6, mask = 0100. Hold and Other Bubble cycles.
162 WAITI bubble i.e. a cycle spent in WaitI power down mode.
163 Value = 417, select = 7, mask = 0001. Instruction TLB Accesses (per inst
164 ruction retiring).
165 ITLB Hit
166 Value = 0, select = 7, mask = 0002. Instruction TLB Accesses (per inst
167 ruction retiring).
168 Replay of instruction due to ITLB miss
169 Value = 0, select = 7, mask = 0004. Instruction TLB Accesses (per inst
170 ruction retiring).
171 HW-assisted TLB Refill completes
172 Value = 0, select = 7, mask = 0008. Instruction TLB Accesses (per inst
173 ruction retiring).
174 ITLB Miss Exception
175 Value = 0, select = 8, mask = 0001. Instruction Memory Accesses (per i
176 nstruction retiring).
177 Instruction Cache Hit
178 Value = 0, select = 8, mask = 0002. Instruction Memory Accesses (per i
179 nstruction retiring).
180 Instruction Cache Miss
181 Value = 420, select = 8, mask = 0004. Instruction Memory Accesses (per i
182 nstruction retiring).
183 All InstRAM or InstROM accesses
184 Value = 0, select = 8, mask = 0008. Instruction Memory Accesses (per i
185 nstruction retiring).
186 Bypass (i.e. uncached) fetch
187 Value = 3, select = 9, mask = 0001. Data TLB Accesses.
188 DTLB Hit
189 Value = 0, select = 9, mask = 0002. Data TLB Accesses.
190 Replay of load/store due to DTLB miss
191 Value = 0, select = 9, mask = 0004. Data TLB Accesses.
192 HW-assisted TLB Refill completes
193 Value = 0, select = 9, mask = 0008. Data TLB Accesses.
194 DTLB Miss Exception
195 Value = 0, select = 10, mask = 0001. Load Instruction (Data Memory).
196 Data Cache Hit(unused)
197 Value = 0, select = 10, mask = 0002. Load Instruction (Data Memory).
198 Data Cache Miss(unused)
199 Value = 3, select = 10, mask = 0004. Load Instruction (Data Memory).
200 Load from local memory i.e. DataRAM, DataROM, InstRAM, InstROM
201
202 Value = 0, select = 10, mask = 0008. Load Instruction (Data Memory).
203 Bypass (i.e. uncached) load
204 Value = 0, select = 13, mask = 0001. Load Instruction (Data Memory).
205 Data Cache Hit(unused)
206 Value = 0, select = 13, mask = 0002. Load Instruction (Data Memory).
207 Data Cache Miss(unused)
208 Value = 0, select = 13, mask = 0004. Load Instruction (Data Memory).
209 Load from local memory i.e. DataRAM, DataROM, InstRAM, InstROM
210
211 Value = 0, select = 13, mask = 0008. Load Instruction (Data Memory).
212 Bypass (i.e. uncached) load
213 Value = 0, select = 16, mask = 0001. Load Instruction (Data Memory).
214 Data Cache Hit (unused)
215 Value = 0, select = 16, mask = 0002. Load Instruction (Data Memory).
216 Data Cache Miss (unused)
217 Value = 0, select = 16, mask = 0004. Load Instruction (Data Memory).
218 Load from local memory i.e. DataRAM, DataROM, InstRAM, InstROM
219
220 Value = 0, select = 16, mask = 0008. Load Instruction (Data Memory).
221 Bypass (i.e. uncached) load
222 Value = 0, select = 11, mask = 0001. Store Instruction (Data Memory).
223 Data Cache Hit (unused)
224 Value = 0, select = 11, mask = 0002. Store Instruction (Data Memory).
225 Data Cache Miss (unused)
226 Value = 0, select = 11, mask = 0004. Store Instruction (Data Memory).
227 Store to local memory i.e. DataRAM, InstRAM
228 Value = 0, select = 11, mask = 0008. Store Instruction (Data Memory).
229 PIF Store
230 Value = 0, select = 14, mask = 0001. Store Instruction (Data Memory).
231 Data Cache Hit(unused)
232 Value = 0, select = 14, mask = 0002. Store Instruction (Data Memory).
233 Data Cache Miss(unused)
234 Value = 0, select = 14, mask = 0004. Store Instruction (Data Memory).
235 Store to local memory i.e. DataRAM, InstRAM
236 Value = 0, select = 14, mask = 0008. Store Instruction (Data Memory).
237 PIF Store
238 Value = 0, select = 17, mask = 0001. Store Instruction (Data Memory).
239 Data Cache Hit (unused)
240 Value = 0, select = 17, mask = 0002. Store Instruction (Data Memory).
241 Data Cache Miss (unused)
242 Value = 0, select = 17, mask = 0004. Store Instruction (Data Memory).
243 Store to local memory i.e. DataRAM, InstRAM
244 Value = 0, select = 17, mask = 0008. Store Instruction (Data Memory).
245 PIF Store
246 Value = 0, select = 12, mask = 0001. Accesses to Data Memory (Load, Sto
247 re, S32C1I, ...).
248 Cache Miss
249 Value = 0, select = 15, mask = 0001. Accesses to Data Memory (Load, Sto
250 re, S32C1I, ...).
251 Cache Miss
252 Value = 0, select = 18, mask = 0001. Accesses to Data Memory (Load, Sto
253 re, S32C1I, ...).
254 Cache Miss
255 Value = 415, select = 22, mask = 0001. Multiple Load/Store.
256 0 stores and 0 loads
257 Value = 3, select = 22, mask = 0002. Multiple Load/Store.
258 0 stores and 1 loads
259 Value = 0, select = 22, mask = 0004. Multiple Load/Store.
260 1 stores and 0 loads
261 Value = 0, select = 22, mask = 0008. Multiple Load/Store.
262 1 stores and 1 loads
263 Value = 0, select = 22, mask = 0010. Multiple Load/Store.
264 0 stores and 2 loads
265 Value = 0, select = 22, mask = 0020. Multiple Load/Store.
266 2 stores and 0 loads
267 Value = 0, select = 23, mask = 0001. Outbound PIF.
268 Castout
269 Value = 0, select = 23, mask = 0002. Outbound PIF.
270 Prefetch
271 Value = 0, select = 24, mask = 0001. Inbound PIF.
272 Data DMA
273 Value = 0, select = 24, mask = 0002. Inbound PIF.
274 Instruction DMA
275 Value = 0, select = 26, mask = 0001. Prefetch.
276 I prefetch-buffer-lookup hit
277 Value = 0, select = 26, mask = 0002. Prefetch.
278 D prefetch-buffer-lookup hit
279 Value = 0, select = 26, mask = 0004. Prefetch.
280 I prefetch-buffer-lookup miss
281 Value = 0, select = 26, mask = 0008. Prefetch.
282 D prefetch-buffer-lookup miss
283 Value = 0, select = 26, mask = 0020. Prefetch.
284 Direct fill to (L1) Data Cache (unused)
285 Value = 0, select = 27, mask = 0001. iDMA.
286 active cycles
287 Value = 0, select = 28, mask = 0001. Length of Instructions.
288 16-bit
289 Value = 0, select = 28, mask = 0002. Length of Instructions.
290 24-bit
291 Value = 0, select = 28, mask = 0004. Length of Instructions.
292 32-bit
293 Value = 0, select = 28, mask = 0008. Length of Instructions.
294 40-bit
295 Value = 0, select = 28, mask = 0010. Length of Instructions.
296 48-bit
297 Value = 0, select = 28, mask = 0020. Length of Instructions.
298 56-bit
299 Value = 0, select = 28, mask = 0040. Length of Instructions.
300 64-bit
301 Value = 0, select = 28, mask = 0080. Length of Instructions.
302 72-bit
303 Value = 0, select = 28, mask = 0100. Length of Instructions.
304 80-bit
305 Value = 0, select = 28, mask = 0200. Length of Instructions.
306 88-bit
307 Value = 0, select = 28, mask = 0400. Length of Instructions.
308 96-bit
309 Value = 0, select = 28, mask = 0800. Length of Instructions.
310 104-bit
311 Value = 0, select = 28, mask = 1000. Length of Instructions.
312 112-bit
313 Value = 0, select = 28, mask = 2000. Length of Instructions.
314 120-bit
315 Value = 0, select = 28, mask = 4000. Length of Instructions.
316 128-bit
317 ```
318 </details>
319
3202. Example calls the second test, which runs the same function under tests. This time, a user-provided list of metrics is measured.
321
322 <details><summary>Example log output:</summary>
323
324 ```
325 I (1588) example: Start test with user defined statistic
326 Value = 743, select = 0, mask = 0001. Counts cycles.
327 Amount of cycles
328 Value = 417, select = 2, mask = 8dff. Successfully Retired Instructions.
329
330 JX instructions
331 CALLXn instructions
332 return instructions (RET, RETW, ...)
333 supervisor return instructions (RFDE, RFE, RFI, RFWO, RFWU)
334 Conditional branch instructions where execution
335 transfers to the target (aka. taken branch),
336 or loopgtz/loopnez instr where execution skips
337 the loop (aka. not-taken loop)
338 J instr
339 CALLn instr
340 Conditional branch instr where execution
341 falls through (aka. not-taken branch)
342 Loop instr where execution falls into loop (aka. taken loop)
343 Last inst of loop and execution transfers
344 to LBEG (aka. loopback taken)
345 Last inst of loop and execution falls
346 through to LEND (aka. loopback fallthrough)
347 Non-branch instr (aka. non-CTI)
348 Value = 3, select = 10, mask = 0004. Load Instruction (Data Memory).
349 Load from local memory i.e. DataRAM, DataROM, InstRAM, InstROM
350
351 Value = 0, select = 11, mask = 0004. Store Instruction (Data Memory).
352 Store to local memory i.e. DataRAM, InstRAM
353 Value = 321, select = 6, mask = 01ed. Hold and Other Bubble cycles.
354 Processor domain PSO bubble
355 R hold caused by Data Cache miss(unused)
356 R hold caused by Store release
357 R hold caused by MEMW, EXTW or EXCW
358 R hold caused by Halt instruction (TX only)
359 CTI bubble (e.g. branch delay slot)
360 WAITI bubble i.e. a cycle spent in WaitI power down mode.
361 Value = 0, select = 6, mask = 0010. Hold and Other Bubble cycles.
362 R hold caused by register dependency
363 Value = 0, select = 1, mask = 0001. Overflow of counter.
364 Overflow counter
365 I (1788) example: The End
366
367 ```
368 </details>
369