From nobody Sun Dec 14 06:15:24 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1593287577; cv=none; d=zohomail.com; s=zohoarc; b=eykifA7+qtIF/gmPIoNfvVadP9xRZ4Rd9mWl8P0dUJks5vtdQXbhu6uiI2yCjtVvmLOqrwdmE2d0BzoZFP5556ndmm3JfXLxcMmSvupB5TiU+5J2A90xvhNL/CgsUBnvGDp3/5KsCUBp4F+35XxQcM59EjBAm5lilmWRNHkvzGc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593287577; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=YU0Awk4ZM0qzu5ZQ6OYVIlPFF2Q2vnGOu2wQJzJ+hiU=; b=XchomAxQFToEZendDOGK6fKbMDEJ/1GNH7OBdJMKyyi2IEQxJzxap1m0PEgjqqVizJnUtHZfDUDAwV4Se9DxRvQXuyJunECK2ySiyoKPj09ZfPngdZ5QwW8yw/SgKKJiepk/2JOBcmepBmZtc/L5jhMIxdrkx7U1q37GgCqLHIo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1593287577310680.9114006595437; Sat, 27 Jun 2020 12:52:57 -0700 (PDT) Received: from localhost ([::1]:52880 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jpGsh-00041h-Tc for importer@patchew.org; Sat, 27 Jun 2020 15:52:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33778) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jpGrf-0002PQ-MG for qemu-devel@nongnu.org; Sat, 27 Jun 2020 15:51:51 -0400 Received: from mail-ed1-x541.google.com ([2a00:1450:4864:20::541]:47023) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jpGrd-0003vH-EQ for qemu-devel@nongnu.org; Sat, 27 Jun 2020 15:51:51 -0400 Received: by mail-ed1-x541.google.com with SMTP id dm19so3218979edb.13 for ; Sat, 27 Jun 2020 12:51:49 -0700 (PDT) Received: from rtrkw774-lin.syrmia.com ([46.240.135.226]) by smtp.gmail.com with ESMTPSA id y11sm5298734ejw.63.2020.06.27.12.51.47 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 27 Jun 2020 12:51:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=YU0Awk4ZM0qzu5ZQ6OYVIlPFF2Q2vnGOu2wQJzJ+hiU=; b=dXzxAkOHciUqGn6ZPzEilCrQxHg5Ri3ldJJArxKfvr9wTnHBW1L2X0cC1WY50K18X7 hih+JdyfiJBJcbVLdoTNFF2UEpEofY6fwiVHDAAonCGsCACBK7fT4ZNSJLXPjGPecH/0 DLkxtAEX/dbC9K8MieUbXd61di95O4PzpulH87E1idpgyAnV1ZOuJW0Gg9ab0vXCVSYh /GzAB174tkNj4lcvwKCVFT9sKhrp5PNyXUiwg6pbQ2D/T/oJvO+3uH0XhXhbbeJ2Rpm8 7J5yN4zuBm2blkx2q7bk/8nX0CMPnnRWNc1+Kkzo9pNh3kruSkUiFfhK+zCtaLHyTNFR QBlw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=YU0Awk4ZM0qzu5ZQ6OYVIlPFF2Q2vnGOu2wQJzJ+hiU=; b=S2SlwcEUAm42HPv4EbvIZWQ6hATFcRr19T7gwFT7Wm1xoaaZfb/go9wNVij8B91XKZ y7dQ3+VUIx+N5MbMmpEHd66RHgLlRbESYZAde2++4qWjw564clfQTBGsnw1qVtcpEKN6 kocpA/B+47hPQ4m9VCYjYYq7AzvEAmDQ0/T7djgfRJZ/u/b1e+Nc1E3thLLJmqs2m8qX S/KgIYWsfgDyaUEzDoqkFkXCDeQBkpla920cb+TroFbHpgpCYY45114dMin4xUq6cB4S 6ZDNkUyofq925gj/5oyYvxqvOVSYXpBsaQ9GlJbSs2NdWuYgeGAxf22igZSrqa9Ey1FH 742A== X-Gm-Message-State: AOAM532M6POcyo+o7/KSvlhpq4xLzwT/ZO7Eo7txCcLg848njUs12Zn8 4oAYzFJ4SrOccY9FYlsm/B1hyQHl X-Google-Smtp-Source: ABdhPJzIJwouQ7MvfJ86uUSXb91n1pOhMuVYtLqZ/4DZBaCIm01BSy/+rbq4tKB1jAgb3QozM/FkeA== X-Received: by 2002:a05:6402:1597:: with SMTP id c23mr9462176edv.243.1593287507972; Sat, 27 Jun 2020 12:51:47 -0700 (PDT) From: Aleksandar Markovic To: qemu-devel@nongnu.org, peter.maydell@linaro.org Subject: [PULL 5/6] scripts/performance: Add topN_callgrind.py script Date: Sat, 27 Jun 2020 21:51:42 +0200 Message-Id: <1593287503-25197-6-git-send-email-aleksandar.qemu.devel@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1593287503-25197-1-git-send-email-aleksandar.qemu.devel@gmail.com> References: <1593287503-25197-1-git-send-email-aleksandar.qemu.devel@gmail.com> Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::541; envelope-from=aleksandar.qemu.devel@gmail.com; helo=mail-ed1-x541.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, PDS_OTHER_BAD_TLD=1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: aleksandar.qemu.devel@gmail.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @gmail.com) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Ahmed Karaman Python script that prints the top N most executed functions in QEMU using callgrind. Syntax: topN_callgrind.py [-h] [-n] -- \ [] \ [] [-h] - Print the script arguments help message. [-n] - Specify the number of top functions to print. - If this flag is not specified, the tool defaults to 25. Example of usage: topN_callgrind.py -n 20 -- qemu-arm coulomb_double-arm Example Output: No. Percentage Function Name Source File Reviewed-by: Aleksandar Markovic ---- --------- ------------------ ------------------------------ 1 24.577% 0x00000000082db000 ??? 2 20.467% float64_mul /fpu/softfloat.c 3 14.720% float64_sub /fpu/softfloat.c 4 13.864% float64_add /fpu/softfloat.c 5 4.876% helper_mulsd /target/i386/ops_sse.h 6 3.767% helper_subsd /target/i386/ops_sse.h 7 3.549% helper_addsd /target/i386/ops_sse.h 8 2.185% helper_ucomisd /target/i386/ops_sse.h 9 1.667% helper_lookup_tb_ptr /include/exec/tb-lookup.h 10 1.662% f64_compare /fpu/softfloat.c 11 1.509% helper_lookup_tb_ptr /accel/tcg/tcg-runtime.c 12 0.635% helper_lookup_tb_ptr /include/exec/exec-all.h 13 0.616% float64_div /fpu/softfloat.c 14 0.502% helper_pand_xmm /target/i386/ops_sse.h 15 0.502% float64_mul /include/fpu/softfloat.h 16 0.476% helper_lookup_tb_ptr /target/i386/cpu.h 17 0.437% float64_compare_quiet /fpu/softfloat.c 18 0.414% helper_pxor_xmm /target/i386/ops_sse.h 19 0.353% round_to_int /fpu/softfloat.c 20 0.347% helper_cc_compute_all /target/i386/cc_helper.c Signed-off-by: Ahmed Karaman Signed-off-by: Aleksandar Markovic Reviewed-by: Aleksandar Markovic Message-Id: <20200626164546.22102-3-ahmedkhaledkaraman@gmail.com> --- scripts/performance/topN_callgrind.py | 140 ++++++++++++++++++++++++++++++= ++++ 1 file changed, 140 insertions(+) create mode 100755 scripts/performance/topN_callgrind.py diff --git a/scripts/performance/topN_callgrind.py b/scripts/performance/to= pN_callgrind.py new file mode 100755 index 0000000..67c5919 --- /dev/null +++ b/scripts/performance/topN_callgrind.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 + +# Print the top N most executed functions in QEMU using callgrind. +# Syntax: +# topN_callgrind.py [-h] [-n] -- \ +# [] \ +# [] +# +# [-h] - Print the script arguments help message. +# [-n] - Specify the number of top functions to print. +# - If this flag is not specified, the tool defaults to 25. +# +# Example of usage: +# topN_callgrind.py -n 20 -- qemu-arm coulomb_double-arm +# +# This file is a part of the project "TCG Continuous Benchmarking". +# +# Copyright (C) 2020 Ahmed Karaman +# Copyright (C) 2020 Aleksandar Markovic +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import argparse +import os +import subprocess +import sys + + +# Parse the command line arguments +parser =3D argparse.ArgumentParser( + usage=3D'topN_callgrind.py [-h] [-n] -- ' + ' [] ' + ' []') + +parser.add_argument('-n', dest=3D'top', type=3Dint, default=3D25, + help=3D'Specify the number of top functions to print.') + +parser.add_argument('command', type=3Dstr, nargs=3D'+', help=3Dargparse.SU= PPRESS) + +args =3D parser.parse_args() + +# Extract the needed variables from the args +command =3D args.command +top =3D args.top + +# Insure that valgrind is installed +check_valgrind_presence =3D subprocess.run(["which", "valgrind"], + stdout=3Dsubprocess.DEVNULL) +if check_valgrind_presence.returncode: + sys.exit("Please install valgrind before running the script!") + +# Run callgrind +callgrind =3D subprocess.run(( + ["valgrind", "--tool=3Dcallgrind", "--callgrind-out-file=3D/tmp/callgr= ind.data"] + + command), + stdout=3Dsubprocess.DEVNULL, + stderr=3Dsubprocess.PIPE) +if callgrind.returncode: + sys.exit(callgrind.stderr.decode("utf-8")) + +# Save callgrind_annotate output to /tmp/callgrind_annotate.out +with open("/tmp/callgrind_annotate.out", "w") as output: + callgrind_annotate =3D subprocess.run(["callgrind_annotate", + "/tmp/callgrind.data"], + stdout=3Doutput, + stderr=3Dsubprocess.PIPE) + if callgrind_annotate.returncode: + os.unlink('/tmp/callgrind.data') + output.close() + os.unlink('/tmp/callgrind_annotate.out') + sys.exit(callgrind_annotate.stderr.decode("utf-8")) + +# Read the callgrind_annotate output to callgrind_data[] +callgrind_data =3D [] +with open('/tmp/callgrind_annotate.out', 'r') as data: + callgrind_data =3D data.readlines() + +# Line number with the total number of instructions +total_instructions_line_number =3D 20 + +# Get the total number of instructions +total_instructions_line_data =3D callgrind_data[total_instructions_line_nu= mber] +total_number_of_instructions =3D total_instructions_line_data.split(' ')[0] +total_number_of_instructions =3D int( + total_number_of_instructions.replace(',', '')) + +# Line number with the top function +first_func_line =3D 25 + +# Number of functions recorded by callgrind, last two lines are always emp= ty +number_of_functions =3D len(callgrind_data) - first_func_line - 2 + +# Limit the number of top functions to "top" +number_of_top_functions =3D (top if number_of_functions > + top else number_of_functions) + +# Store the data of the top functions in top_functions[] +top_functions =3D callgrind_data[first_func_line: + first_func_line + number_of_top_functions] + +# Print table header +print('{:>4} {:>10} {:<30} {}\n{} {} {} {}'.format('No.', + 'Percentage', + 'Function Name', + 'Source File', + '-' * 4, + '-' * 10, + '-' * 30, + '-' * 30, + )) + +# Print top N functions +for (index, function) in enumerate(top_functions, start=3D1): + function_data =3D function.split() + # Calculate function percentage + function_instructions =3D float(function_data[0].replace(',', '')) + function_percentage =3D (function_instructions / + total_number_of_instructions)*100 + # Get function name and source files path + function_source_file, function_name =3D function_data[1].split(':') + # Print extracted data + print('{:>4} {:>9.3f}% {:<30} {}'.format(index, + round(function_percentage,= 3), + function_name, + function_source_file)) + +# Remove intermediate files +os.unlink('/tmp/callgrind.data') +os.unlink('/tmp/callgrind_annotate.out') --=20 2.7.4