Add support for pinning down Adreno GPU frequency for benchmarking (#8120)
This commit adds a new script for pinning down Adreno GPU frequencies
for benchmarking purposes. It also adjusted the scripts for pinning down
Pixel 6 Mali GPU frequencies for consistency.
diff --git a/build_tools/benchmarks/run_benchmarks_on_android.py b/build_tools/benchmarks/run_benchmarks_on_android.py
index 560981a..54567b1 100755
--- a/build_tools/benchmarks/run_benchmarks_on_android.py
+++ b/build_tools/benchmarks/run_benchmarks_on_android.py
@@ -60,12 +60,10 @@
from typing import Any, Dict, List, Optional, Sequence, Tuple, TextIO, Set
-from common.benchmark_definition import (AndroidDeviceInfo, BenchmarkInfo,
- BenchmarkResults, BenchmarkRun,
- execute_cmd,
- execute_cmd_and_get_output,
- get_android_device_model,
- IREE_PRETTY_NAMES_TO_DRIVERS)
+from common.benchmark_definition import (
+ AndroidDeviceInfo, BenchmarkInfo, BenchmarkResults, BenchmarkRun,
+ execute_cmd, execute_cmd_and_get_output, get_android_device_model,
+ get_android_gpu_name, IREE_PRETTY_NAMES_TO_DRIVERS)
# All benchmarks' relative path against root build directory.
BENCHMARK_SUITE_REL_PATH = "benchmark_suites"
@@ -88,6 +86,7 @@
"adreno-640": "gpu-adreno",
"adreno-650": "gpu-adreno",
"adreno-660": "gpu-adreno",
+ "adreno-730": "gpu-adreno",
"mali-g77": "gpu-mali-valhall",
"mali-g78": "gpu-mali-valhall",
}
@@ -176,6 +175,18 @@
return execute_cmd(cmd, verbose=verbose)
+def is_magisk_su():
+ """Returns true if the Android device has a Magisk SU binary."""
+ return "MagiskSU" in adb_execute_and_get_output(["su", "--help"])
+
+
+def adb_execute_as_root(cmd_args: Sequence[str]) -> subprocess.CompletedProcess:
+ """Executes the given command as root."""
+ cmd = ["su", "-c" if is_magisk_su() else "root"]
+ cmd.extend(cmd_args)
+ return adb_execute(cmd)
+
+
def adb_start_cmd(cmd_args: Sequence[str],
relative_dir: str,
verbose: bool = False) -> subprocess.Popen:
@@ -550,23 +561,27 @@
def set_cpu_frequency_scaling_governor(governor: str):
git_root = execute_cmd_and_get_output(["git", "rev-parse", "--show-toplevel"])
- cpu_script = os.path.join(
- git_root, "build_tools/benchmarks/set_android_scaling_governor.sh")
+ cpu_script = os.path.join(git_root, "build_tools", "benchmarks",
+ "set_android_scaling_governor.sh")
android_path = adb_push_to_tmp_dir(cpu_script)
- adb_execute(["su", "root", android_path, governor])
+ adb_execute_as_root([android_path, governor])
def set_gpu_frequency_scaling_policy(policy: str):
git_root = execute_cmd_and_get_output(["git", "rev-parse", "--show-toplevel"])
device_model = get_android_device_model()
+ gpu_name = get_android_gpu_name()
if device_model == "Pixel-6" or device_model == "Pixel-6-Pro":
- gpu_script = os.path.join(
- git_root, "build_tools/benchmarks/set_pixel6_gpu_scaling_policy.sh")
+ gpu_script = os.path.join(git_root, "build_tools", "benchmarks",
+ "set_pixel6_gpu_scaling_policy.sh")
+ elif gpu_name.lower().startswith("adreno"):
+ gpu_script = os.path.join(git_root, "build_tools", "benchmarks",
+ "set_adreno_gpu_scaling_policy.sh")
else:
raise RuntimeError(
f"Unsupported device '{device_model}' for setting GPU scaling policy")
android_path = adb_push_to_tmp_dir(gpu_script)
- adb_execute(["su", "root", android_path, policy])
+ adb_execute_as_root([android_path, policy])
def parse_arguments():
@@ -679,8 +694,8 @@
set_cpu_frequency_scaling_governor("performance")
atexit.register(set_cpu_frequency_scaling_governor, "schedutil")
if args.pin_gpu_freq:
- set_gpu_frequency_scaling_policy("always_on")
- atexit.register(set_gpu_frequency_scaling_policy, "coarse_demand")
+ set_gpu_frequency_scaling_policy("performance")
+ atexit.register(set_gpu_frequency_scaling_policy, "default")
previous_benchmarks = None
previous_captures = None
diff --git a/build_tools/benchmarks/set_adreno_gpu_scaling_policy.sh b/build_tools/benchmarks/set_adreno_gpu_scaling_policy.sh
new file mode 100755
index 0000000..d2aca56
--- /dev/null
+++ b/build_tools/benchmarks/set_adreno_gpu_scaling_policy.sh
@@ -0,0 +1,89 @@
+#!/bin/sh
+
+# Copyright 2022 The IREE Authors
+#
+# Licensed under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+# Runs on a phone with Adreno GPU to set the GPU frequency scaling policy.
+
+################################### WARNING ####################################
+# This will overheat the phone if it's not on a cooling plate, resulting in #
+# thermal throttling. To prevent anything catching on fire, the actual GPU #
+# frequencies will be throttled to below the maximum, skewing your results. #
+################################################################################
+
+set -euo pipefail
+
+POLICY="${1:-performance}"
+
+readonly ADRENO_GPU_PATH="/sys/class/kgsl/kgsl-3d0"
+
+# Available frequencies are sorted, either in ascending or descending order.
+readonly ADRENO_MIN_FREQ=$(cat "${ADRENO_GPU_PATH}/devfreq/available_frequencies" | tr " " "\n" | sort -u -n | head -1)
+readonly ADRENO_MAX_FREQ=$(cat "${ADRENO_GPU_PATH}/devfreq/available_frequencies" | tr " " "\n" | sort -u -n | tail -1)
+
+# Power levels match available freqencies.
+readonly ADRENO_MAX_PWRLEVEL=0
+(( ADRENO_MIN_PWRLEVEL = $(cat "${ADRENO_GPU_PATH}/num_pwrlevels") - 1 ))
+readonly ADRENO_MIN_PWRLEVEL
+
+# Idle timers affect governor change and frequncy reset.
+readonly ADRENO_DEFAULT_IDLE_TIMER=80 # ms
+readonly ADRENO_1HOUR_IDLE_TIMER=3600000 # ms
+
+echo "GPU info (before changing frequency scaling policy):"
+echo 'model\t\tcur\t\tmin\t\tmax'
+echo "---------------------------------------------------------"
+paste \
+ "${ADRENO_GPU_PATH}/gpu_model" \
+ "${ADRENO_GPU_PATH}/devfreq/cur_freq" \
+ "${ADRENO_GPU_PATH}/devfreq/min_freq" \
+ "${ADRENO_GPU_PATH}/devfreq/max_freq"
+
+echo "Setting GPU frequency scaling policy to ${POLICY}"
+
+case "$POLICY" in
+ performance)
+ echo 1 > "${ADRENO_GPU_PATH}/force_clk_on"
+ echo ${ADRENO_1HOUR_IDLE_TIMER} > "${ADRENO_GPU_PATH}/idle_timer"
+
+ # Some devices only expose the msm-adreno-tz governor, so allow the
+ # following to fail.
+ echo performance > "${ADRENO_GPU_PATH}/devfreq/governor" || true
+
+ echo ${ADRENO_MAX_FREQ} > "${ADRENO_GPU_PATH}/gpuclk"
+ echo ${ADRENO_MAX_FREQ} > "${ADRENO_GPU_PATH}/devfreq/max_freq"
+ echo ${ADRENO_MAX_FREQ} > "${ADRENO_GPU_PATH}/devfreq/min_freq"
+
+ echo ${ADRENO_MAX_PWRLEVEL} > "${ADRENO_GPU_PATH}/max_pwrlevel"
+ echo ${ADRENO_MAX_PWRLEVEL} > "${ADRENO_GPU_PATH}/min_pwrlevel"
+ ;;
+ default)
+ echo 0 > "${ADRENO_GPU_PATH}/force_clk_on"
+ echo ${ADRENO_DEFAULT_IDLE_TIMER} > "${ADRENO_GPU_PATH}/idle_timer"
+
+ # msm-adreno-tz is the default governor for Adreno GPUs.
+ echo msm-adreno-tz > "${ADRENO_GPU_PATH}/devfreq/governor"
+
+ echo ${ADRENO_MAX_FREQ} > "${ADRENO_GPU_PATH}/devfreq/max_freq"
+ echo ${ADRENO_MIN_FREQ} > "${ADRENO_GPU_PATH}/devfreq/min_freq"
+
+ echo ${ADRENO_MAX_PWRLEVEL} > "${ADRENO_GPU_PATH}/max_pwrlevel"
+ echo ${ADRENO_MIN_PWRLEVEL} > "${ADRENO_GPU_PATH}/min_pwrlevel"
+ ;;
+ *)
+ echo "Unknown frequency scaling policy: ${POLICY}"
+ exit 1
+ ;;
+esac
+
+echo "GPU info (after changing frequency scaling policy):"
+echo 'model\t\tcur\t\tmin\t\tmax'
+echo "---------------------------------------------------------"
+paste \
+ "${ADRENO_GPU_PATH}/gpu_model" \
+ "${ADRENO_GPU_PATH}/devfreq/cur_freq" \
+ "${ADRENO_GPU_PATH}/devfreq/min_freq" \
+ "${ADRENO_GPU_PATH}/devfreq/max_freq"
diff --git a/build_tools/benchmarks/set_pixel6_gpu_scaling_policy.sh b/build_tools/benchmarks/set_pixel6_gpu_scaling_policy.sh
index 4fbbbb3..da8ba36 100755
--- a/build_tools/benchmarks/set_pixel6_gpu_scaling_policy.sh
+++ b/build_tools/benchmarks/set_pixel6_gpu_scaling_policy.sh
@@ -16,11 +16,11 @@
set -euo pipefail
-POLICY="${1:-always_on}"
+POLICY="${1:-performance}"
readonly MALI_GPU_PATH="/sys/devices/platform/1c500000.mali"
-echo "GPU info (before changing power policy):"
+echo "GPU info (before changing frequency scaling policy):"
echo 'policy\t\t\t\t\tcur\tmin\tmax'
echo "--------------------------------------------------------------"
paste \
@@ -29,22 +29,26 @@
"${MALI_GPU_PATH}/min_freq" \
"${MALI_GPU_PATH}/max_freq"
-echo "Setting GPU power policy to ${POLICY}"
+echo "Setting GPU frequency scaling policy to ${POLICY}"
-if [[ "$POLICY" == "always_on" ]]; then
- echo "always_on" > "${MALI_GPU_PATH}/power_policy"
- cat "${MALI_GPU_PATH}/max_freq" > "${MALI_GPU_PATH}/scaling_max_freq"
- cat "${MALI_GPU_PATH}/max_freq" > "${MALI_GPU_PATH}/scaling_min_freq"
-elif [[ "$POLICY" == "coarse_demand" ]]; then
- echo "coarse_demand" > "${MALI_GPU_PATH}/power_policy"
- cat "${MALI_GPU_PATH}/max_freq" > "${MALI_GPU_PATH}/scaling_max_freq"
- cat "${MALI_GPU_PATH}/min_freq" > "${MALI_GPU_PATH}/scaling_min_freq"
-else
- echo "Unknown power policy: ${POLICY}"
- exit 1
-fi
+case "$POLICY" in
+ performance)
+ echo "always_on" > "${MALI_GPU_PATH}/power_policy"
+ cat "${MALI_GPU_PATH}/max_freq" > "${MALI_GPU_PATH}/scaling_max_freq"
+ cat "${MALI_GPU_PATH}/max_freq" > "${MALI_GPU_PATH}/scaling_min_freq"
+ ;;
+ default)
+ echo "coarse_demand" > "${MALI_GPU_PATH}/power_policy"
+ cat "${MALI_GPU_PATH}/max_freq" > "${MALI_GPU_PATH}/scaling_max_freq"
+ cat "${MALI_GPU_PATH}/min_freq" > "${MALI_GPU_PATH}/scaling_min_freq"
+ ;;
+ *)
+ echo "Unknown frequency scaling policy: ${POLICY}"
+ exit 1
+ ;;
+esac
-echo "GPU info (after changing power policy):"
+echo "GPU info (after changing frequency scaling policy):"
echo 'policy\t\t\t\t\tcur\tmin\tmax'
echo "--------------------------------------------------------------"
paste \
diff --git a/build_tools/buildkite/cmake/android/arm64-v8a/benchmark2.yml b/build_tools/buildkite/cmake/android/arm64-v8a/benchmark2.yml
index 26cef0d..963f393 100644
--- a/build_tools/buildkite/cmake/android/arm64-v8a/benchmark2.yml
+++ b/build_tools/buildkite/cmake/android/arm64-v8a/benchmark2.yml
@@ -32,7 +32,7 @@
- "tar -xzvf benchmark-suites-${BUILDKITE_BUILD_NUMBER}.tgz"
- "tar -xzvf iree-android-tools-${BUILDKITE_BUILD_NUMBER}.tgz"
- "tar -xzvf tracy-capture-058e8901.tgz"
- - "python3 build_tools/benchmarks/run_benchmarks_on_android.py --pin-cpu-freq --normal_benchmark_tool=build-android/iree/tools/iree-benchmark-module --traced_benchmark_tool=build-android-trace/iree/tools/iree-benchmark-module --trace_capture_tool=tracy-capture -o benchmark-results-pixel-4-${BUILDKITE_BUILD_NUMBER}.json --capture_tarball=trace-captures-pixel-4-${BUILDKITE_BUILD_NUMBER}.tgz --verbose build-host/"
+ - "python3 build_tools/benchmarks/run_benchmarks_on_android.py --pin-cpu-freq --pin-gpu-freq --normal_benchmark_tool=build-android/iree/tools/iree-benchmark-module --traced_benchmark_tool=build-android-trace/iree/tools/iree-benchmark-module --trace_capture_tool=tracy-capture -o benchmark-results-pixel-4-${BUILDKITE_BUILD_NUMBER}.json --capture_tarball=trace-captures-pixel-4-${BUILDKITE_BUILD_NUMBER}.tgz --verbose build-host/"
if: "build.pull_request.id == null || (build.pull_request.labels includes 'buildkite:benchmark')"
agents:
- "android-soc=snapdragon-855"