1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2023 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker// 3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker// 7*6dbdd20aSAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker// 9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport {Trace} from '../../public/trace'; 16*6dbdd20aSAndroid Build Coastguard Workerimport {PerfettoPlugin} from '../../public/plugin'; 17*6dbdd20aSAndroid Build Coastguard Workerimport {addDebugSliceTrack} from '../../components/tracks/debug_tracks'; 18*6dbdd20aSAndroid Build Coastguard Workerimport {addQueryResultsTab} from '../../components/query_table/query_result_tab'; 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Workerconst PERF_TRACE_COUNTERS_PRECONDITION = ` 21*6dbdd20aSAndroid Build Coastguard Worker SELECT 22*6dbdd20aSAndroid Build Coastguard Worker str_value 23*6dbdd20aSAndroid Build Coastguard Worker FROM metadata 24*6dbdd20aSAndroid Build Coastguard Worker WHERE 25*6dbdd20aSAndroid Build Coastguard Worker name = 'trace_config_pbtxt' 26*6dbdd20aSAndroid Build Coastguard Worker AND str_value GLOB '*ftrace_events: "perf_trace_counters/sched_switch_with_ctrs"*' 27*6dbdd20aSAndroid Build Coastguard Worker`; 28*6dbdd20aSAndroid Build Coastguard Worker 29*6dbdd20aSAndroid Build Coastguard Workerexport default class implements PerfettoPlugin { 30*6dbdd20aSAndroid Build Coastguard Worker static readonly id = 'dev.perfetto.AndroidPerfTraceCounters'; 31*6dbdd20aSAndroid Build Coastguard Worker async onTraceLoad(ctx: Trace): Promise<void> { 32*6dbdd20aSAndroid Build Coastguard Worker const resp = await ctx.engine.query(PERF_TRACE_COUNTERS_PRECONDITION); 33*6dbdd20aSAndroid Build Coastguard Worker if (resp.numRows() === 0) return; 34*6dbdd20aSAndroid Build Coastguard Worker ctx.commands.registerCommand({ 35*6dbdd20aSAndroid Build Coastguard Worker id: 'dev.perfetto.AndroidPerfTraceCounters#ThreadRuntimeIPC', 36*6dbdd20aSAndroid Build Coastguard Worker name: 'Add a track to show a thread runtime ipc', 37*6dbdd20aSAndroid Build Coastguard Worker callback: async (tid) => { 38*6dbdd20aSAndroid Build Coastguard Worker if (tid === undefined) { 39*6dbdd20aSAndroid Build Coastguard Worker tid = prompt('Enter a thread tid', ''); 40*6dbdd20aSAndroid Build Coastguard Worker if (tid === null) return; 41*6dbdd20aSAndroid Build Coastguard Worker } 42*6dbdd20aSAndroid Build Coastguard Worker const sqlPrefix = ` 43*6dbdd20aSAndroid Build Coastguard Worker WITH 44*6dbdd20aSAndroid Build Coastguard Worker sched_switch_ipc AS ( 45*6dbdd20aSAndroid Build Coastguard Worker SELECT 46*6dbdd20aSAndroid Build Coastguard Worker ts, 47*6dbdd20aSAndroid Build Coastguard Worker EXTRACT_ARG(arg_set_id, 'prev_pid') AS tid, 48*6dbdd20aSAndroid Build Coastguard Worker EXTRACT_ARG(arg_set_id, 'prev_comm') AS thread_name, 49*6dbdd20aSAndroid Build Coastguard Worker EXTRACT_ARG(arg_set_id, 'inst') / (EXTRACT_ARG(arg_set_id, 'cyc') * 1.0) AS ipc, 50*6dbdd20aSAndroid Build Coastguard Worker EXTRACT_ARG(arg_set_id, 'inst') AS instruction, 51*6dbdd20aSAndroid Build Coastguard Worker EXTRACT_ARG(arg_set_id, 'cyc') AS cycle, 52*6dbdd20aSAndroid Build Coastguard Worker EXTRACT_ARG(arg_set_id, 'stallbm') AS stall_backend_mem, 53*6dbdd20aSAndroid Build Coastguard Worker EXTRACT_ARG(arg_set_id, 'l3dm') AS l3_cache_miss 54*6dbdd20aSAndroid Build Coastguard Worker FROM ftrace_event 55*6dbdd20aSAndroid Build Coastguard Worker WHERE name = 'sched_switch_with_ctrs' AND tid = ${tid} 56*6dbdd20aSAndroid Build Coastguard Worker ), 57*6dbdd20aSAndroid Build Coastguard Worker target_thread_sched_slice AS ( 58*6dbdd20aSAndroid Build Coastguard Worker SELECT s.*, t.tid, t.name FROM sched s LEFT JOIN thread t USING (utid) 59*6dbdd20aSAndroid Build Coastguard Worker WHERE t.tid = ${tid} 60*6dbdd20aSAndroid Build Coastguard Worker ), 61*6dbdd20aSAndroid Build Coastguard Worker target_thread_ipc_slice AS ( 62*6dbdd20aSAndroid Build Coastguard Worker SELECT 63*6dbdd20aSAndroid Build Coastguard Worker ( 64*6dbdd20aSAndroid Build Coastguard Worker SELECT 65*6dbdd20aSAndroid Build Coastguard Worker ts 66*6dbdd20aSAndroid Build Coastguard Worker FROM target_thread_sched_slice ts 67*6dbdd20aSAndroid Build Coastguard Worker WHERE ts.tid = ssi.tid AND ts.ts < ssi.ts 68*6dbdd20aSAndroid Build Coastguard Worker ORDER BY ts.ts DESC 69*6dbdd20aSAndroid Build Coastguard Worker LIMIT 1 70*6dbdd20aSAndroid Build Coastguard Worker ) AS ts, 71*6dbdd20aSAndroid Build Coastguard Worker ( 72*6dbdd20aSAndroid Build Coastguard Worker SELECT 73*6dbdd20aSAndroid Build Coastguard Worker dur 74*6dbdd20aSAndroid Build Coastguard Worker FROM target_thread_sched_slice ts 75*6dbdd20aSAndroid Build Coastguard Worker WHERE ts.tid = ssi.tid AND ts.ts < ssi.ts 76*6dbdd20aSAndroid Build Coastguard Worker ORDER BY ts.ts DESC 77*6dbdd20aSAndroid Build Coastguard Worker LIMIT 1 78*6dbdd20aSAndroid Build Coastguard Worker ) AS dur, 79*6dbdd20aSAndroid Build Coastguard Worker ssi.ipc, 80*6dbdd20aSAndroid Build Coastguard Worker ssi.instruction, 81*6dbdd20aSAndroid Build Coastguard Worker ssi.cycle, 82*6dbdd20aSAndroid Build Coastguard Worker ssi.stall_backend_mem, 83*6dbdd20aSAndroid Build Coastguard Worker ssi.l3_cache_miss 84*6dbdd20aSAndroid Build Coastguard Worker FROM sched_switch_ipc ssi 85*6dbdd20aSAndroid Build Coastguard Worker ) 86*6dbdd20aSAndroid Build Coastguard Worker `; 87*6dbdd20aSAndroid Build Coastguard Worker 88*6dbdd20aSAndroid Build Coastguard Worker await addDebugSliceTrack({ 89*6dbdd20aSAndroid Build Coastguard Worker trace: ctx, 90*6dbdd20aSAndroid Build Coastguard Worker data: { 91*6dbdd20aSAndroid Build Coastguard Worker sqlSource: 92*6dbdd20aSAndroid Build Coastguard Worker sqlPrefix + 93*6dbdd20aSAndroid Build Coastguard Worker ` 94*6dbdd20aSAndroid Build Coastguard Worker SELECT * FROM target_thread_ipc_slice WHERE ts IS NOT NULL`, 95*6dbdd20aSAndroid Build Coastguard Worker }, 96*6dbdd20aSAndroid Build Coastguard Worker title: 'Rutime IPC:' + tid, 97*6dbdd20aSAndroid Build Coastguard Worker columns: {ts: 'ts', dur: 'dur', name: 'ipc'}, 98*6dbdd20aSAndroid Build Coastguard Worker argColumns: [ 99*6dbdd20aSAndroid Build Coastguard Worker 'instruction', 100*6dbdd20aSAndroid Build Coastguard Worker 'cycle', 101*6dbdd20aSAndroid Build Coastguard Worker 'stall_backend_mem', 102*6dbdd20aSAndroid Build Coastguard Worker 'l3_cache_miss', 103*6dbdd20aSAndroid Build Coastguard Worker ], 104*6dbdd20aSAndroid Build Coastguard Worker }); 105*6dbdd20aSAndroid Build Coastguard Worker addQueryResultsTab(ctx, { 106*6dbdd20aSAndroid Build Coastguard Worker query: 107*6dbdd20aSAndroid Build Coastguard Worker sqlPrefix + 108*6dbdd20aSAndroid Build Coastguard Worker ` 109*6dbdd20aSAndroid Build Coastguard Worker SELECT 110*6dbdd20aSAndroid Build Coastguard Worker (sum(instruction) * 1.0 / sum(cycle)*1.0) AS avg_ipc, 111*6dbdd20aSAndroid Build Coastguard Worker sum(dur)/1e6 as total_runtime_ms, 112*6dbdd20aSAndroid Build Coastguard Worker sum(instruction) AS total_instructions, 113*6dbdd20aSAndroid Build Coastguard Worker sum(cycle) AS total_cycles, 114*6dbdd20aSAndroid Build Coastguard Worker sum(stall_backend_mem) as total_stall_backend_mem, 115*6dbdd20aSAndroid Build Coastguard Worker sum(l3_cache_miss) as total_l3_cache_miss 116*6dbdd20aSAndroid Build Coastguard Worker FROM target_thread_ipc_slice WHERE ts IS NOT NULL`, 117*6dbdd20aSAndroid Build Coastguard Worker title: 'target thread ipc statistic', 118*6dbdd20aSAndroid Build Coastguard Worker }); 119*6dbdd20aSAndroid Build Coastguard Worker }, 120*6dbdd20aSAndroid Build Coastguard Worker }); 121*6dbdd20aSAndroid Build Coastguard Worker } 122*6dbdd20aSAndroid Build Coastguard Worker} 123