From 9e743cdff215e6dfc6db21929552b1e101be2a88 Mon Sep 17 00:00:00 2001 From: vedithal-amd Date: Thu, 12 Jun 2025 14:21:24 -0400 Subject: [PATCH] Remove rocscope related code and add deprecation warning for mongo db usecase (#744) * Remove rocscope related code * Add deprecation warning for database update mode which is used for grafana and mongodb functionality [ROCm/rocprofiler-compute commit: cdd41dee40481f8c847cb932b0ebbb7092fc324f] --- projects/rocprofiler-compute/CHANGELOG.md | 2 + .../docs/how-to/analyze/grafana-gui.rst | 4 + .../docs/install/grafana-setup.rst | 4 + projects/rocprofiler-compute/src/argparser.py | 43 -- .../src/rocprof_compute_base.py | 51 +-- .../rocprof_compute_profile/profiler_base.py | 8 +- .../profiler_rocscope.py | 58 --- .../src/rocprof_compute_soc/soc_gfx906.py | 2 +- .../src/rocprof_compute_soc/soc_gfx908.py | 2 +- .../src/rocprof_compute_soc/soc_gfx90a.py | 2 +- .../src/utils/gfx_perfmon_builder.py | 395 ------------------ .../rocprofiler-compute/src/utils/parser.py | 3 +- .../src/utils/resources.py | 35 -- .../rocprofiler-compute/src/utils/utils.py | 24 -- 14 files changed, 35 insertions(+), 598 deletions(-) delete mode 100644 projects/rocprofiler-compute/src/rocprof_compute_profile/profiler_rocscope.py delete mode 100755 projects/rocprofiler-compute/src/utils/gfx_perfmon_builder.py delete mode 100644 projects/rocprofiler-compute/src/utils/resources.py diff --git a/projects/rocprofiler-compute/CHANGELOG.md b/projects/rocprofiler-compute/CHANGELOG.md index 9aa0f7317f..459288e14c 100644 --- a/projects/rocprofiler-compute/CHANGELOG.md +++ b/projects/rocprofiler-compute/CHANGELOG.md @@ -62,6 +62,8 @@ Full documentation for ROCm Compute Profiler is available at [https://rocm.docs. * Support MEM chart on CLI(single run) +* Add deprecation warning for database update mode. + ### Changed * Change normal_unit default to per_kernel diff --git a/projects/rocprofiler-compute/docs/how-to/analyze/grafana-gui.rst b/projects/rocprofiler-compute/docs/how-to/analyze/grafana-gui.rst index 110347911d..105bc0fefb 100644 --- a/projects/rocprofiler-compute/docs/how-to/analyze/grafana-gui.rst +++ b/projects/rocprofiler-compute/docs/how-to/analyze/grafana-gui.rst @@ -7,6 +7,10 @@ Grafana GUI analysis ******************** +.. warning:: + + Grafana and MongoDB functionality is deprecated and will be removed in a future release. + Find setup instructions in :doc:`../../install/grafana-setup`. The ROCm Compute Profiler Grafana analysis dashboard GUI supports the following features to diff --git a/projects/rocprofiler-compute/docs/install/grafana-setup.rst b/projects/rocprofiler-compute/docs/install/grafana-setup.rst index 62f983624c..3753081e01 100644 --- a/projects/rocprofiler-compute/docs/install/grafana-setup.rst +++ b/projects/rocprofiler-compute/docs/install/grafana-setup.rst @@ -7,6 +7,10 @@ Setting up Grafana server for ROCm Compute Profiler *************************************************** +.. warning:: + + Grafana and MongoDB functionality is deprecated and will be removed in a future release. + A Grafana server is *not required* to profile or analyze performance data from the CLI. It's a supplementary mechanism to help you import performance data and examine it in a detailed diff --git a/projects/rocprofiler-compute/src/argparser.py b/projects/rocprofiler-compute/src/argparser.py index 2460a08712..58e31838b4 100644 --- a/projects/rocprofiler-compute/src/argparser.py +++ b/projects/rocprofiler-compute/src/argparser.py @@ -239,49 +239,6 @@ Examples: help="\t\t\tSpecify the directory of customized report section configs.", default=rocprof_compute_home.joinpath("rocprof_compute_soc/analysis_configs/"), ) - - result = shutil.which("rocscope") - if result: - profile_group.add_argument( - "-l", - "--i-feel-lucky", - required=False, - default=False, - action="store_true", - dest="lucky", - help="\t\t\tProfile only the most time consuming kernels.", - ) - profile_group.add_argument( - "-r", - "--use-rocscope", - required=False, - default=False, - action="store_true", - dest="use_rocscope", - help="\t\t\tUse rocscope for profiling", - ) - profile_group.add_argument( - "-s", - "--kernel-summaries", - required=False, - default=False, - action="store_true", - dest="summaries", - help="\t\t\tCreate kernel summaries.", - ) - else: - profile_group.add_argument( - "--i-feel-lucky", default=False, dest="lucky", help=argparse.SUPPRESS - ) - profile_group.add_argument( - "--use-rocscope", default=False, dest="use_rocscope", help=argparse.SUPPRESS - ) - profile_group.add_argument( - "--kernel-summaries", - default=False, - dest="summaries", - help=argparse.SUPPRESS, - ) profile_group.add_argument( "--join-type", metavar="", diff --git a/projects/rocprofiler-compute/src/rocprof_compute_base.py b/projects/rocprofiler-compute/src/rocprof_compute_base.py index 0b5f780835..6ae7f285f6 100644 --- a/projects/rocprofiler-compute/src/rocprof_compute_base.py +++ b/projects/rocprofiler-compute/src/rocprof_compute_base.py @@ -115,30 +115,20 @@ class RocProfCompute: return def detect_profiler(self): - if ( - self.__args.lucky == True - or self.__args.summaries == True - or self.__args.use_rocscope - ): - if not shutil.which("rocscope"): - console_error("Rocscope must be in PATH") - else: - self.__profiler_mode = "rocscope" + profiler_mode = detect_rocprof(self.__args) + if str(profiler_mode).endswith("rocprof"): + self.__profiler_mode = "rocprofv1" + elif str(profiler_mode).endswith("rocprofv2"): + self.__profiler_mode = "rocprofv2" + elif str(profiler_mode).endswith("rocprofv3"): + self.__profiler_mode = "rocprofv3" + elif str(profiler_mode) == "rocprofiler-sdk": + self.__profiler_mode = "rocprofiler-sdk" else: - profiler_mode = detect_rocprof(self.__args) - if str(profiler_mode).endswith("rocprof"): - self.__profiler_mode = "rocprofv1" - elif str(profiler_mode).endswith("rocprofv2"): - self.__profiler_mode = "rocprofv2" - elif str(profiler_mode).endswith("rocprofv3"): - self.__profiler_mode = "rocprofv3" - elif str(profiler_mode) == "rocprofiler-sdk": - self.__profiler_mode = "rocprofiler-sdk" - else: - console_error( - "Incompatible profiler: %s. Supported profilers include: %s" - % (profiler_mode, get_submodules("rocprof_compute_profile")) - ) + console_error( + "Incompatible profiler: %s. Supported profilers include: %s" + % (profiler_mode, get_submodules("rocprof_compute_profile")) + ) return def detect_analyze(self): @@ -302,15 +292,6 @@ class RocProfCompute: self.__soc[self.__mspec.gpu_arch], self.__supported_archs, ) - elif self.__profiler_mode == "rocscope": - from rocprof_compute_profile.profiler_rocscope import rocscope_profiler - - profiler = rocscope_profiler( - self.__args, - self.__profiler_mode, - self.__soc[self.__mspec.gpu_arch], - self.__supported_archs, - ) elif self.__profiler_mode == "rocprofiler-sdk": from rocprof_compute_profile.profiler_rocprofiler_sdk import ( rocprofiler_sdk_profiler, @@ -364,6 +345,12 @@ class RocProfCompute: @demarcate def update_db(self): self.print_graphic() + + console_warning( + "Database update mode is deprecated and will be removed in a future release " + "and no fixes will be made for this mode." + ) + from utils.db_connector import DatabaseConnector db_connection = DatabaseConnector(self.__args) diff --git a/projects/rocprofiler-compute/src/rocprof_compute_profile/profiler_base.py b/projects/rocprofiler-compute/src/rocprof_compute_profile/profiler_base.py index 3e3eac8da6..5982d24f23 100644 --- a/projects/rocprofiler-compute/src/rocprof_compute_profile/profiler_base.py +++ b/projects/rocprofiler-compute/src/rocprof_compute_profile/profiler_base.py @@ -48,7 +48,6 @@ from utils.utils import ( pc_sampling_prof, print_status, run_prof, - run_rocscope, ) @@ -430,11 +429,8 @@ class RocProfCompute_Base: ) ) - elif self.__profiler == "rocscope": - run_rocscope(self.__args, fname) - else: - # TODO: Finish logic - console_error("Profiler not supported") + # TODO: Finish logic + console_error("Profiler not supported") if self.__pc_sampling == True and self.__profiler in ( "rocprofv3", diff --git a/projects/rocprofiler-compute/src/rocprof_compute_profile/profiler_rocscope.py b/projects/rocprofiler-compute/src/rocprof_compute_profile/profiler_rocscope.py deleted file mode 100644 index efdddba260..0000000000 --- a/projects/rocprofiler-compute/src/rocprof_compute_profile/profiler_rocscope.py +++ /dev/null @@ -1,58 +0,0 @@ -##############################################################################bl -# MIT License -# -# Copyright (c) 2021 - 2025 Advanced Micro Devices, Inc. All Rights Reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -##############################################################################el - -from rocprof_compute_profile.profiler_base import RocProfCompute_Base -from utils.logger import console_log, demarcate - - -class rocscope_profiler(RocProfCompute_Base): - def __init__(self, profiling_args, profiler_mode, soc, supported_archs): - super().__init__(profiling_args, profiler_mode, soc, supported_archs) - - # ----------------------- - # Required child methods - # ----------------------- - @demarcate - def pre_processing(self): - """Perform any pre-processing steps prior to profiling.""" - self.__profiler = "rocscope" - console_log("profiling", "pre-processing using %s profiler" % self.__profiler) - # TODO: Finish implementation - - @demarcate - def run_profiling(self, version, prog): - """Run profiling.""" - console_log( - "profiling", "performing profiling using %s profiler" % self.__profiler - ) - # TODO: Finish implementation - - @demarcate - def post_processing(self): - """Perform any post-processing steps prior to profiling.""" - console_log( - "profiling", - "performing post-processing using %s profiler" % self.__profiler, - ) - # TODO: Finish implementation diff --git a/projects/rocprofiler-compute/src/rocprof_compute_soc/soc_gfx906.py b/projects/rocprofiler-compute/src/rocprof_compute_soc/soc_gfx906.py index 3619167b81..d0c34a1c9f 100644 --- a/projects/rocprofiler-compute/src/rocprof_compute_soc/soc_gfx906.py +++ b/projects/rocprofiler-compute/src/rocprof_compute_soc/soc_gfx906.py @@ -31,7 +31,7 @@ class gfx906_soc(OmniSoC_Base): def __init__(self, args, mspec): super().__init__(args, mspec) self.set_arch("gfx906") - self.set_compatible_profilers(["rocprofv1", "rocscope"]) + self.set_compatible_profilers(["rocprofv1"]) # Per IP block max number of simultaneous counters. GFX IP Blocks self.set_perfmon_config({mi_gpu_specs.get_perfmon_config("gfx906")}) diff --git a/projects/rocprofiler-compute/src/rocprof_compute_soc/soc_gfx908.py b/projects/rocprofiler-compute/src/rocprof_compute_soc/soc_gfx908.py index 2957e83104..0cc6f0fdeb 100644 --- a/projects/rocprofiler-compute/src/rocprof_compute_soc/soc_gfx908.py +++ b/projects/rocprofiler-compute/src/rocprof_compute_soc/soc_gfx908.py @@ -35,7 +35,7 @@ class gfx908_soc(OmniSoC_Base): super().__init__(args, mspec) self.set_arch("gfx908") self.set_compatible_profilers( - ["rocprofv1", "rocscope", "rocprofv3", "rocprofiler-sdk"] + ["rocprofv1", "rocprofv3", "rocprofiler-sdk"] ) # Per IP block max number of simultaneous counters. GFX IP Blocks self.set_perfmon_config(mi_gpu_specs.get_perfmon_config("gfx908")) diff --git a/projects/rocprofiler-compute/src/rocprof_compute_soc/soc_gfx90a.py b/projects/rocprofiler-compute/src/rocprof_compute_soc/soc_gfx90a.py index a034675bcc..8fb612668f 100644 --- a/projects/rocprofiler-compute/src/rocprof_compute_soc/soc_gfx90a.py +++ b/projects/rocprofiler-compute/src/rocprof_compute_soc/soc_gfx90a.py @@ -48,7 +48,7 @@ class gfx90a_soc(OmniSoC_Base): ) ) self.set_compatible_profilers( - ["rocprofv1", "rocscope", "rocprofv2", "rocprofv3", "rocprofiler-sdk"] + ["rocprofv1", "rocprofv2", "rocprofv3", "rocprofiler-sdk"] ) # Per IP block max number of simultaneous counters. GFX IP Blocks self.set_perfmon_config(mi_gpu_specs.get_perfmon_config("gfx90a")) diff --git a/projects/rocprofiler-compute/src/utils/gfx_perfmon_builder.py b/projects/rocprofiler-compute/src/utils/gfx_perfmon_builder.py deleted file mode 100755 index 90cedf9583..0000000000 --- a/projects/rocprofiler-compute/src/utils/gfx_perfmon_builder.py +++ /dev/null @@ -1,395 +0,0 @@ -##############################################################################bl -# MIT License -# -# Copyright (c) 2021 - 2025 Advanced Micro Devices, Inc. All Rights Reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -##############################################################################el - -import sys - -from lxml import html -from PyQt5.QtGui import QStandardItem, QStandardItemModel -from PyQt5.QtWidgets import ( - QAbstractItemView, - QAction, - QApplication, - QFileDialog, - QHBoxLayout, - QMainWindow, - QTableWidget, - QTableWidgetItem, - QTreeView, - QWidget, - qApp, -) - - -# class view(QWidget): -class mainWindow(QMainWindow): - def __init__(self): - super(QMainWindow, self).__init__() - - ############################################################################### - # SOC Parameters - ############################################################################## - - # Per IP block max number of simulutaneous counters - # GFX IP Blocks - self.perfmon_config = { - "SQ": 8, - "TA": 2, - "TD": 2, - "TCP": 4, - "TCC": 4, - "CPC": 2, - "CPF": 2, - "SPI": 2, - "GRBM": 2, - "GDS": 4, - } - - # GFX Architectures - self.soc_arch_list = ["gfx906", "gfx908", "gfx90a"] - - ############################################################################### - # Window layout Design - ############################################################################## - - self.block_list = [] - self.nodes_dict = {} # list of QStandardItem - - self.tree = QTreeView(self) - self.table = QTableWidget() - - # Tree setup - self.tree.header().setDefaultSectionSize(180) - self.model = QStandardItemModel() - self.model.setHorizontalHeaderLabels(["Metric", "Block", "Event", "Definition"]) - - self.tree.setModel(self.model) - # self.importData(data) - self.tree.setEditTriggers(QAbstractItemView.NoEditTriggers) - - # Set up click processing - self.tree.clicked.connect(self.pmc_select) - # self.tree.expandAll() - - # Table setup - tableHeader = list(self.perfmon_config.keys()) - self.table.setColumnCount(len(tableHeader)) - self.table.setHorizontalHeaderLabels(tableHeader) - self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) - self.table.showGrid() - - self.setWindowTitle("GFX Perfmon Builder") - # layout: lhs: metrics; rhs: selected perfmon - layout = QHBoxLayout(self) - layout.addWidget(self.tree) - layout.addWidget(self.table) - - widget = QWidget() - widget.setLayout(layout) - self.setCentralWidget(widget) - - # Add Status - self.statusBar() - - ############################################################################### - # Window Menu Design - ############################################################################## - - # Setup file menu - menuBar = self.menuBar() - menuBar.setNativeMenuBar(False) - - openAction = QAction("&Open", self) - openAction.setShortcut("Ctrl+O") - openAction.setStatusTip("Open GFX Metrics file") - openAction.triggered.connect(self.openGFXDialog) - - saveAction = QAction("&Save", self) - saveAction.setShortcut("Ctrl+S") - saveAction.setStatusTip("Save to PMC file") - saveAction.triggered.connect(self.exportGFXDialog) - - exitAction = QAction("&Exit", self) - exitAction.setShortcut("Ctrl+Q") - exitAction.setStatusTip("Exit") - exitAction.triggered.connect(self.close) - - # Create new action - fileMenu = menuBar.addMenu("&File") - fileMenu.addActions([openAction, saveAction]) - fileMenu.addSeparator() - fileMenu.addActions([exitAction]) - - def openGFXDialog(self): - options = QFileDialog.Options() - options |= QFileDialog.DontUseNativeDialog - fileName, _ = QFileDialog.getOpenFileName( - self, "Open GFX Metrics", "", "XML Files (*.xml)", "XML(*.xml)" - ) - - # Parse the xml - if fileName: - xmlparsed = html.parse(fileName) - self.importData(xmlparsed) - - def exportGFXDialog(self): - options = QFileDialog.Options() - options |= QFileDialog.DontUseNativeDialog - fileName, _ = QFileDialog.getSaveFileName( - self, "Export PMC Counters", "", "Text File (*.txt)", "Text File(*.txt)" - ) - - # Parse the xml - if fileName: - self.exportPMCCounters(fileName) - - def exportPMCCounters(self, fileName): - f = open(fileName, "w") - - total_IP_blocks = len(list(self.perfmon_config.keys())) - for row in range(self.table.rowCount()): - pmc_str = "pmc: " - for col in range(total_IP_blocks): - cell = self.table.item(row, col) - - if cell: - pmc_str = pmc_str + " ".join(cell.text().split("\n")) + " " - - f.write(pmc_str + "\n") - - # Add standard lines - f.write("\n\n") - f.write("gpu: \n") - f.write("dispatch: \n") - f.write("kernel: \n") - - f.close() - - return - - def pmc_metric_selected(self, metric_name, col): - # check if the metric already exists - metric_selected = False - - for row in range(self.table.rowCount()): - entry = self.table.item(row, col) - if entry: - pmc_list = entry.text().split(sep="\n") - if metric_name in pmc_list: - metric_selected = True - break - - return metric_selected - - def pmc_remove_metric(self, metric_name, IP_block): - # Remove the metric to pmc table, if it is selected - - # Map SQC to SQ, since they share the same Perfmon block - if IP_block == "SQC": - IP_block = "SQ" - - # not action if it is for a ghost IP! - if not IP_block in list(self.perfmon_config.keys()): - return - - # This is the column we need to add/remove perfmon counters - col = list(self.perfmon_config.keys()).index(IP_block) - - if not self.pmc_metric_selected(metric_name, col): - return - - pmc_list = [] - for row in range(self.table.rowCount()): - entry = self.table.item(row, col) - - if entry: - pmc_list = pmc_list + entry.text().split(sep="\n") - # clear the cell, we will re-allocate the pmc - - self.table.takeItem(row, col) - - # allowed PMC counters per batch - max_pmc_num = self.perfmon_config[IP_block] - - # remote this metric and re-segment the list and refill all rows in this column - pmc_list.remove(metric_name) - - # We are empty now, do nothing - if len(pmc_list) == 0: - return - - for row in range((len(pmc_list) + max_pmc_num - 1) // max_pmc_num): - start_index = row * max_pmc_num - pmc_str = "\n".join(pmc_list[start_index : start_index + max_pmc_num]) - self.table.setItem(row, col, QTableWidgetItem(pmc_str)) - - # Remove last row, if empty - last_row = self.table.rowCount() - 1 - empty_row = True - total_cols = len(list(self.perfmon_config.keys())) - for cindex in range(total_cols): - x = self.table.item(last_row, cindex) - - if x and x.text(): - empty_row = False - break - - if empty_row: - self.table.removeRow(last_row) - - def pmc_add_metric(self, metric_name, IP_block): - # Add the metric to pmc table, if not there yet - - # Map SQC to SQ, since they share the same Perfmon block - if IP_block == "SQC": - IP_block = "SQ" - - if not IP_block in list(self.perfmon_config.keys()): - return - - # This is the column we need to add/remove perfmon counters - col = list(self.perfmon_config.keys()).index(IP_block) - - # check if the metric already exists - if self.pmc_metric_selected(metric_name, col): - return - - # metric is not bucket yet, add it! - if self.table.rowCount() == 0: - # starting from scratch! - self.table.insertRow(0) - self.table.setItem(0, col, QTableWidgetItem(metric_name)) - return - - # find the row to insert - for row in range(self.table.rowCount()): - entry = self.table.item(row, col) - if not entry: - # print("search insert pos, row:", row, ", cell empty") - break - - if len(entry.text().split(sep="\n")) < self.perfmon_config[IP_block]: - # print("found") - break - - entry = self.table.item(row, col) - if not entry: - # put it into the empty cell - self.table.setItem(row, col, QTableWidgetItem(metric_name)) - return - - pmc_list = entry.text().split(sep="\n") - - if len(pmc_list) < self.perfmon_config[IP_block]: - # we still have hit per-IP HW counters limit, add it to the last row - pmc_list.append(metric_name) - pmc_str = "\n".join(pmc_list) - self.table.setItem(row, col, QTableWidgetItem(pmc_str)) - self.table.resizeRowsToContents() - else: - # Start a new row - row = row + 1 - self.table.insertRow(row) - self.table.setItem(row, col, QTableWidgetItem(metric_name)) - - def pmc_select(self, item): - metric_name = item.data() - if ( - not metric_name in self.nodes_dict - or not self.nodes_dict[metric_name].isCheckable() - ): - return - - # only proper metrics check/uncheck is processed here. - IP_block = item.data().split(sep="_")[0] - - if self.nodes_dict[metric_name].checkState() == 0: - # unselect the metric in the table if it is currently selected - self.pmc_remove_metric(metric_name, IP_block) - - elif self.nodes_dict[metric_name].checkState() == 2: - self.pmc_add_metric(metric_name, IP_block) - - # Function to save populate treeview with a dictionary - def importData(self, xmlparsed, root=None): - self.model.setRowCount(0) - if root is None: - root = self.model.invisibleRootItem() - - for x in xmlparsed.getiterator(): - # Add SoC node to Root - if x.tag in self.soc_arch_list: - parent = root - parent.appendRow([QStandardItem(x.tag)]) - self.nodes_dict[x.tag] = parent.child(parent.rowCount() - 1) - - # check all metrics in an SoC family - if x.tag == "metric" and x.getparent().tag in self.soc_arch_list: - # New IP block (e.g., SQ), detected, create a new hierarchy for the block - if not x.attrib["block"] in self.block_list: - self.block_list.append(x.attrib["block"]) - parent = self.nodes_dict[x.getparent().tag] # the SoC node - parent.appendRow( - [ - QStandardItem(x.attrib["block"]), - QStandardItem(""), - QStandardItem(""), - QStandardItem(""), - ] - ) - - # record the tree node for the block - self.nodes_dict[x.attrib["block"]] = parent.child( - parent.rowCount() - 1 - ) - - # Add metric node to the Block node - parent = self.nodes_dict[x.attrib["block"]] - metric_name = QStandardItem(x.attrib["name"]) - metric_name.setCheckable(True) - parent.appendRow( - [ - metric_name, - QStandardItem(x.attrib["block"]), - QStandardItem(x.attrib["event"]), - QStandardItem(x.attrib["descr"]), - ] - ) - - self.nodes_dict[x.attrib["name"]] = parent.child(parent.rowCount() - 1) - - -if __name__ == "__main__": - app = QApplication(sys.argv) - app.setStyle("Fusion") - - # populate the view with GFX metrics.xml - window = mainWindow() - - # show the view - window.setGeometry(300, 100, 600, 300) - # view.setWindowTitle('GFX Perfmon Counters') - window.show() - - # start the application - sys.exit(app.exec_()) diff --git a/projects/rocprofiler-compute/src/utils/parser.py b/projects/rocprofiler-compute/src/utils/parser.py index b348707755..4855aa28a3 100644 --- a/projects/rocprofiler-compute/src/utils/parser.py +++ b/projects/rocprofiler-compute/src/utils/parser.py @@ -689,9 +689,8 @@ def eval_metric(dfs, dfs_type, sys_info, raw_pmc_df, debug): # confirm no illogical counter values (only consider non-roofline runs) roof_only_run = sys_info.ip_blocks == "roofline" - rocscope_run = sys_info.ip_blocks == "rocscope" if ( - (not rocscope_run and not roof_only_run) + (not roof_only_run) and hasattr(raw_pmc_df["pmc_perf"], "GRBM_GUI_ACTIVE") and (raw_pmc_df["pmc_perf"]["GRBM_GUI_ACTIVE"] == 0).any() ): diff --git a/projects/rocprofiler-compute/src/utils/resources.py b/projects/rocprofiler-compute/src/utils/resources.py deleted file mode 100644 index cf86cb6985..0000000000 --- a/projects/rocprofiler-compute/src/utils/resources.py +++ /dev/null @@ -1,35 +0,0 @@ -##############################################################################bl -# MIT License -# -# Copyright (c) 2021 - 2025 Advanced Micro Devices, Inc. All Rights Reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -##############################################################################el - -import pathlib -import sys - - -def get_resource_path(relative_path): - rel_path = pathlib.Path(relative_path) - dev_base_path = ( - pathlib.Path(__file__).resolve().parent.parent.parent.parent - ) # rocprof_compute dir (whereas equiv comd in rocprof_compute.py returns src dir) - base_path = getattr(sys, "_MEIPASS", dev_base_path) - return dev_base_path diff --git a/projects/rocprofiler-compute/src/utils/utils.py b/projects/rocprofiler-compute/src/utils/utils.py index 58dba43db4..0a428432a2 100644 --- a/projects/rocprofiler-compute/src/utils/utils.py +++ b/projects/rocprofiler-compute/src/utils/utils.py @@ -1234,30 +1234,6 @@ def detect_roofline(mspec): return target_binary -def run_rocscope(args, fname): - # profile the app - if args.use_rocscope == True: - result = shutil.which("rocscope") - if result: - rs_cmd = [ - result.stdout.decode("ascii").strip(), - "metrics", - "-p", - args.path, - "-n", - args.name, - "-t", - fname, - "--", - ] - for i in args.remaining.split(): - rs_cmd.append(i) - console_log(rs_cmd) - success, output = capture_subprocess_output(rs_cmd) - if not success: - console_error(result.stderr.decode("ascii")) - - def mibench(args, mspec): """Run roofline microbenchmark to generate peek BW and FLOP measurements.""" console_log("roofline", "No roofline data found. Generating...")