From 4756bf12f9dbe6502b3831808d7e4f217586980a Mon Sep 17 00:00:00 2001 From: Nir Ekhauz Date: Sun, 27 Jun 2021 11:20:24 +0300 Subject: run_platform.py PMU configuration Enable configuration of up to 4 PMU counters Jira: MLBEDSW-4744 Change-Id: I08e9073d827033b3340bffd680288b1a83833d64 --- applications/baremetal/main.cpp | 26 ++++++++++++++++++++++---- scripts/run_platform.py | 16 ++++++++++++---- targets/corstone-300/CMakeLists.txt | 11 +++++++++++ 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/applications/baremetal/main.cpp b/applications/baremetal/main.cpp index 8b1bc2b..af14e20 100644 --- a/applications/baremetal/main.cpp +++ b/applications/baremetal/main.cpp @@ -54,16 +54,34 @@ InferenceProcess::InferenceProcess inferenceProcess(TFLuTensorArena, TENSOR_AREN uint8_t outputData[sizeof(expectedOutputData)] __attribute__((aligned(16), section("output_data_sec"))); +#ifndef ETHOSU_PMU_EVENT_0 +#define ETHOSU_PMU_EVENT_0 ETHOSU_PMU_CYCLE +#endif +#ifndef ETHOSU_PMU_EVENT_1 +#define ETHOSU_PMU_EVENT_1 ETHOSU_PMU_NPU_ACTIVE +#endif +#ifndef ETHOSU_PMU_EVENT_2 +#define ETHOSU_PMU_EVENT_2 ETHOSU_PMU_NO_EVENT +#endif +#ifndef ETHOSU_PMU_EVENT_3 +#define ETHOSU_PMU_EVENT_3 ETHOSU_PMU_NO_EVENT +#endif + #ifdef ETHOSU constexpr int32_t EventComponentNo = 0x00; namespace { -std::vector pmuEventConfig{ETHOSU_PMU_CYCLE, ETHOSU_PMU_NPU_ACTIVE}; -std::vector eventRecMessageIds{EventID(EventLevelDetail, EventComponentNo, ETHOSU_PMU_CYCLE), - EventID(EventLevelDetail, EventComponentNo, ETHOSU_PMU_NPU_ACTIVE)}; +std::vector pmuEventConfig{ethosu_pmu_event_type(ETHOSU_PMU_EVENT_0), + ethosu_pmu_event_type(ETHOSU_PMU_EVENT_1), + ethosu_pmu_event_type(ETHOSU_PMU_EVENT_2), + ethosu_pmu_event_type(ETHOSU_PMU_EVENT_3)}; +std::vector eventRecMessageIds{EventID(EventLevelDetail, EventComponentNo, ETHOSU_PMU_EVENT_0), + EventID(EventLevelDetail, EventComponentNo, ETHOSU_PMU_EVENT_1), + EventID(EventLevelDetail, EventComponentNo, ETHOSU_PMU_EVENT_2), + EventID(EventLevelDetail, EventComponentNo, ETHOSU_PMU_EVENT_3)}; const uint32_t delayMs = SystemCoreClock / 60ul; struct ethosu_driver *ethosuDrv; -EthosUMonitor ethosuMonitor(eventRecMessageIds, EthosUMonitor::Backend::EVENT_RECORDER); +EthosUMonitor ethosuMonitor(eventRecMessageIds, EthosUMonitor::Backend::PRINTF); } // namespace extern "C" { diff --git a/scripts/run_platform.py b/scripts/run_platform.py index 93ba7cd..c0ee822 100755 --- a/scripts/run_platform.py +++ b/scripts/run_platform.py @@ -39,13 +39,21 @@ def run_cmd(cmd, **kwargs): print(f"Running command: {cmd_str}") return subprocess.run(cmd, check=True, **kwargs) -def build_core_platform(output_folder, target, toolchain): + +def build_core_platform(output_folder, target, toolchain, pmu): build_folder = output_folder/"model"/"build" + inner_pmu = [0, 0, 0, 0] + for idx in range(len(pmu)): + inner_pmu[idx] = pmu[idx] cmake_cmd = ["cmake", CORE_PLATFORM_PATH/"targets"/target, f"-B{build_folder}", f"-DCMAKE_TOOLCHAIN_FILE={CORE_PLATFORM_PATH/'cmake'/'toolchain'/(toolchain + '.cmake')}", - f"-DBAREMETAL_PATH={output_folder}"] + f"-DBAREMETAL_PATH={output_folder}", + f"-DETHOSU_PMU_EVENT_0={inner_pmu[0]}", + f"-DETHOSU_PMU_EVENT_1={inner_pmu[1]}", + f"-DETHOSU_PMU_EVENT_2={inner_pmu[2]}", + f"-DETHOSU_PMU_EVENT_3={inner_pmu[3]}"] run_cmd(cmake_cmd) @@ -137,6 +145,7 @@ def main(): } parser = argparse.ArgumentParser() parser.add_argument("-o", "--output-folder", type=pathlib.Path, default="output", help="Output folder for build and generated files") + parser.add_argument("--pmu", type=int, action='append', help="PMU Event Counters") parser.add_argument("--network-path", type=pathlib.Path, required=True, help="Path to .tflite file") parser.add_argument("--target", choices=target_mapping, default="corstone-300", help=f"Configure target") parser.add_argument("--toolchain", choices=["armclang", "arm-none-eabi-gcc"], default="armclang", help=f"Configure toolchain") @@ -144,13 +153,12 @@ def main(): parser.add_argument("--custom-output", type=pathlib.Path, help="Custom expected output data for network") args = parser.parse_args() - args.output_folder.mkdir(exist_ok=True) try: optimize_network(args.output_folder, args.network_path, target_mapping[args.target]) generate_reference_data(args.output_folder, args.network_path, args.custom_input, args.custom_output) - build_core_platform(args.output_folder, args.target, args.toolchain) + build_core_platform(args.output_folder, args.target, args.toolchain, args.pmu) run_model(args.output_folder) except subprocess.CalledProcessError as err: print(f"Command: '{err.cmd}' failed", file=sys.stderr) diff --git a/targets/corstone-300/CMakeLists.txt b/targets/corstone-300/CMakeLists.txt index 9c527fc..06469d8 100644 --- a/targets/corstone-300/CMakeLists.txt +++ b/targets/corstone-300/CMakeLists.txt @@ -58,6 +58,17 @@ set(ETHOSU_TARGET_NPU_CONFIG "ethos-u55-128" CACHE STRING "NPU configuration") set(ETHOSU_TARGET_NPU_COUNT 1 CACHE INTERNAL "Number of NPUs") set(ETHOSU_TARGET_NPU_TA_COUNT 2 CACHE INTERNAL "Number of timing adapters per NPU") +set(ETHOSU_PMU_EVENT_0 0 CACHE STRING "PMU Event #0") +set(ETHOSU_PMU_EVENT_1 0 CACHE STRING "PMU Event #1") +set(ETHOSU_PMU_EVENT_2 0 CACHE STRING "PMU Event #2") +set(ETHOSU_PMU_EVENT_3 0 CACHE STRING "PMU Event #3") + +target_compile_definitions(ethosu_target_common INTERFACE + ETHOSU_PMU_EVENT_0=${ETHOSU_PMU_EVENT_0} + ETHOSU_PMU_EVENT_1=${ETHOSU_PMU_EVENT_1} + ETHOSU_PMU_EVENT_2=${ETHOSU_PMU_EVENT_2} + ETHOSU_PMU_EVENT_3=${ETHOSU_PMU_EVENT_3}) + target_compile_definitions(ethosu_target_common INTERFACE ETHOSU_NPU_TA_COUNT=${ETHOSU_TARGET_NPU_TA_COUNT} ETHOSU_NPU_COUNT=${ETHOSU_TARGET_NPU_COUNT}) -- cgit v1.2.1