mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-03-21 01:59:13 +00:00
workloads/geekbench: Add support for Geekbench command-line build
Add Geekbench command-line build workload for Android targets. Geekbench apks allow to user to run the tests altogether. Using the command-line, a single test or multiple tests can be specified. Signed-off-by: Elif Topuz <elif.topuz@arm.com>
This commit is contained in:
parent
b03f28d1d5
commit
0732fa9cf0
@ -1,4 +1,4 @@
|
|||||||
# Copyright 2013-2018 ARM Limited
|
# Copyright 2013-2025 ARM Limited
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
@ -20,10 +20,11 @@ import tempfile
|
|||||||
import json
|
import json
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
|
||||||
from wa import ApkUiautoWorkload, Parameter
|
from wa import Workload, ApkUiautoWorkload, Parameter
|
||||||
from wa.framework.exception import ConfigError, WorkloadError
|
from wa.framework.exception import ConfigError, WorkloadError
|
||||||
from wa.utils.misc import capitalize
|
from wa.utils.misc import capitalize
|
||||||
from wa.utils.types import version_tuple
|
from wa.utils.types import version_tuple, list_or_integer
|
||||||
|
from wa.utils.exec_control import once
|
||||||
|
|
||||||
|
|
||||||
class Geekbench(ApkUiautoWorkload):
|
class Geekbench(ApkUiautoWorkload):
|
||||||
@ -370,3 +371,233 @@ class GeekbenchCorproate(Geekbench): # pylint: disable=too-many-ancestors
|
|||||||
|
|
||||||
def namemify(basename, i):
|
def namemify(basename, i):
|
||||||
return basename + (' {}'.format(i) if i else '')
|
return basename + (' {}'.format(i) if i else '')
|
||||||
|
|
||||||
|
|
||||||
|
class GeekbenchCmdline(Workload):
|
||||||
|
|
||||||
|
name = "geekbench_cli"
|
||||||
|
description = "Workload for running command line version Geekbench"
|
||||||
|
|
||||||
|
gb6_workloads = {
|
||||||
|
# Single-Core and Multi-Core
|
||||||
|
101: 'File Compression',
|
||||||
|
102: 'Navigation',
|
||||||
|
103: 'HTML5 Browser',
|
||||||
|
104: 'PDF Renderer',
|
||||||
|
105: 'Photo Library',
|
||||||
|
201: 'Clang',
|
||||||
|
202: 'Text Processing',
|
||||||
|
203: 'Asset Compression',
|
||||||
|
301: 'Object Detection',
|
||||||
|
402: 'Object Remover',
|
||||||
|
403: 'HDR',
|
||||||
|
404: 'Photo Filter',
|
||||||
|
501: 'Ray Tracer',
|
||||||
|
502: 'Structure from Motion',
|
||||||
|
# OpenCL and Vulkan
|
||||||
|
303: 'Face Detection',
|
||||||
|
406: 'Edge Detection',
|
||||||
|
407: 'Gaussian Blur',
|
||||||
|
503: 'Feature Matching',
|
||||||
|
504: 'Stereo Matching',
|
||||||
|
601: 'Particle Physics',
|
||||||
|
# Single-Core, Multi-Core, OpenCL, and Vulkan
|
||||||
|
302: 'Background Blur',
|
||||||
|
401: 'Horizon Detection',
|
||||||
|
}
|
||||||
|
|
||||||
|
gb5_workloads = {
|
||||||
|
# Single-Core and Multi-Core
|
||||||
|
101: 'AES-XTS',
|
||||||
|
201: 'Text Compression',
|
||||||
|
202: 'Image Compression',
|
||||||
|
203: 'Navigation',
|
||||||
|
204: 'HTML5',
|
||||||
|
205: 'SQLite',
|
||||||
|
206: 'PDF Rendering',
|
||||||
|
207: 'Text Rendering',
|
||||||
|
208: 'Clang',
|
||||||
|
209: 'Camera',
|
||||||
|
301: 'N-Body Physics',
|
||||||
|
302: 'Rigid Body Physics',
|
||||||
|
307: 'Image Inpainting',
|
||||||
|
308: 'HDR',
|
||||||
|
309: 'Ray Tracing',
|
||||||
|
310: 'Structure from Motion',
|
||||||
|
312: 'Speech Recognition',
|
||||||
|
313: 'Machine Learning',
|
||||||
|
# OpenCL and Vulkan
|
||||||
|
220: 'Sobel',
|
||||||
|
221: 'Canny',
|
||||||
|
222: 'Stereo Matching',
|
||||||
|
230: 'Histogram Equalization',
|
||||||
|
304: 'Depth of Field',
|
||||||
|
311: 'Feature Matching',
|
||||||
|
320: 'Particle Physics',
|
||||||
|
321: 'SFFT',
|
||||||
|
# Single-Core, Multi-Core, OpenCL, and Vulkan
|
||||||
|
303: 'Gaussian Blur',
|
||||||
|
305: 'Face Detection',
|
||||||
|
306: 'Horizon Detection',
|
||||||
|
}
|
||||||
|
|
||||||
|
binary_name = 'geekbench_aarch64'
|
||||||
|
|
||||||
|
allowed_extensions = ['json', 'csv', 'xml', 'html', 'text']
|
||||||
|
|
||||||
|
parameters = [
|
||||||
|
Parameter('cpumask', kind=str, default='',
|
||||||
|
description='CPU mask used by taskset.'),
|
||||||
|
Parameter('section', kind=int, default=1, allowed_values=[1, 4, 9],
|
||||||
|
description="""Run the specified sections. It should be 1 for CPU benchmarks,
|
||||||
|
4 for OpenCL benchmarks and 9 for Vulkan benchmarks."""),
|
||||||
|
Parameter('upload', kind=bool, default=False,
|
||||||
|
description='Upload results to Geekbench Browser'),
|
||||||
|
Parameter('is_single_core', kind=bool, default=True,
|
||||||
|
description='Run workload in single-core or multi-core mode.'),
|
||||||
|
Parameter('workload', kind=list_or_integer, default=301,
|
||||||
|
description='Specify workload to run'),
|
||||||
|
Parameter('iterations', kind=int, default=5,
|
||||||
|
description='Number of iterations'),
|
||||||
|
Parameter('workload_gap', kind=int, default=2000,
|
||||||
|
description='N milliseconds gap between workloads'),
|
||||||
|
Parameter('output_file', kind=str, default='gb_cli.json',
|
||||||
|
description=f"""Specify the name of the output results file.
|
||||||
|
If it is not specified, the output file will be generated as a JSON file.
|
||||||
|
It can be {', '.join(allowed_extensions)} files."""),
|
||||||
|
Parameter('timeout', kind=int, default=2000,
|
||||||
|
description='The test timeout in ms. It should be long for 1000 iterations.'),
|
||||||
|
Parameter('version', kind=str, default='6.3.0',
|
||||||
|
description='Specifies which version of the Geekbench should run.'),
|
||||||
|
]
|
||||||
|
|
||||||
|
def __init__(self, target, **kwargs):
|
||||||
|
super(GeekbenchCmdline, self).__init__(target, **kwargs)
|
||||||
|
self.target_result_json = None
|
||||||
|
self.host_result_json = None
|
||||||
|
self.workloads = self.gb6_workloads
|
||||||
|
self.params = ''
|
||||||
|
self.output = ''
|
||||||
|
self.target_exec_directory = ''
|
||||||
|
self.tar_file_src = ''
|
||||||
|
self.tar_file_dst = ''
|
||||||
|
self.file_exists = False
|
||||||
|
|
||||||
|
def init_resources(self, context):
|
||||||
|
"""
|
||||||
|
Retrieves necessary files to run the benchmark in TAR format.
|
||||||
|
WA will look for `gb_cli_artifacts_<version>.tar` file to deploy them to the
|
||||||
|
working directory. If there is no specified version, it will look for version
|
||||||
|
6.3.0 by default.
|
||||||
|
"""
|
||||||
|
self.deployable_assets = [''.join(['gb_cli_artifacts', '_', self.version, '.tar'])]
|
||||||
|
|
||||||
|
# Create an executables directory
|
||||||
|
self.target_exec_directory = self.target.path.join(self.target.executables_directory, f'gb_cli-{self.version}')
|
||||||
|
self.target.execute("mkdir -p {}".format(self.target_exec_directory))
|
||||||
|
|
||||||
|
# Source and Destination paths for the artifacts tar file
|
||||||
|
self.tar_file_src = self.target.path.join(self.target.working_directory, self.deployable_assets[0])
|
||||||
|
self.tar_file_dst = self.target.path.join(self.target_exec_directory, self.deployable_assets[0])
|
||||||
|
# Check the tar file if it already exists
|
||||||
|
if self.target.file_exists(self.tar_file_dst):
|
||||||
|
self.file_exists = True
|
||||||
|
else:
|
||||||
|
# Get the assets file
|
||||||
|
super(GeekbenchCmdline, self).init_resources(context)
|
||||||
|
|
||||||
|
@once
|
||||||
|
def initialize(self, context):
|
||||||
|
if self.version[0] == '5':
|
||||||
|
self.workloads = self.gb5_workloads
|
||||||
|
# If the tar file does not exist in the target, deploy the assets
|
||||||
|
if not self.file_exists:
|
||||||
|
super(GeekbenchCmdline, self).initialize(context)
|
||||||
|
# Move the tar file to the executables directory
|
||||||
|
self.target.execute(
|
||||||
|
'{} mv {} {}'.format(
|
||||||
|
self.target.busybox, self.tar_file_src, self.tar_file_dst))
|
||||||
|
# Extract the tar file
|
||||||
|
self.target.execute(
|
||||||
|
'{} tar -xf {} -C {}'.format(
|
||||||
|
self.target.busybox, self.tar_file_dst, self.target_exec_directory))
|
||||||
|
|
||||||
|
def setup(self, context):
|
||||||
|
super(GeekbenchCmdline, self).setup(context)
|
||||||
|
|
||||||
|
self.params = ''
|
||||||
|
|
||||||
|
self.params += '--section {} '.format(self.section)
|
||||||
|
if self.section == 1:
|
||||||
|
self.params += '--single-core ' if self.is_single_core else '--multi-core '
|
||||||
|
|
||||||
|
self.params += '--upload ' if self.upload else '--no-upload '
|
||||||
|
|
||||||
|
known_workloads = '\n'.join("{}: {}".format(k, v) for k, v in self.workloads.items())
|
||||||
|
if any([t not in self.workloads.keys() for t in self.workload]):
|
||||||
|
msg = 'Unknown workload(s) specified. Known workloads: {}'
|
||||||
|
raise ValueError(msg.format(known_workloads))
|
||||||
|
|
||||||
|
self.params += '--workload {} '.format(''.join("{},".format(i) for i in self.workload))
|
||||||
|
|
||||||
|
if self.iterations:
|
||||||
|
self.params += '--iterations {} '.format(self.iterations)
|
||||||
|
|
||||||
|
if self.workload_gap:
|
||||||
|
self.params += '--workload-gap {} '.format(self.workload_gap)
|
||||||
|
|
||||||
|
extension = os.path.splitext(self.output_file)[1][1:]
|
||||||
|
if self.output_file and extension not in self.allowed_extensions:
|
||||||
|
msg = f"No allowed extension specified. Allowed extensions: {', '.join(self.allowed_extensions)}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
elif self.output_file:
|
||||||
|
# Output results file with the given name and extension
|
||||||
|
self.target_result_json = os.path.join(self.target_exec_directory, self.output_file)
|
||||||
|
self.params += '--export-{} {}'.format(extension, self.target_result_json)
|
||||||
|
self.host_result_json = os.path.join(context.output_directory, self.output_file)
|
||||||
|
else:
|
||||||
|
# The output file is not specified
|
||||||
|
self.target_result_json = os.path.join(self.target_exec_directory, self.output_file)
|
||||||
|
self.params += '--save {}'.format(self.target_result_json)
|
||||||
|
self.host_result_json = os.path.join(context.output_directory, self.output_file)
|
||||||
|
|
||||||
|
def run(self, context):
|
||||||
|
super(GeekbenchCmdline, self).run(context)
|
||||||
|
taskset = f"taskset {self.cpumask}" if self.cpumask else ""
|
||||||
|
binary = self.target.path.join(self.target_exec_directory, self.binary_name)
|
||||||
|
cmd = '{} {} {}'.format(taskset, binary, self.params)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.output = self.target.execute(cmd, timeout=self.timeout, as_root=True)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
self.target.killall(self.binary_name)
|
||||||
|
raise
|
||||||
|
|
||||||
|
def update_output(self, context):
|
||||||
|
super(GeekbenchCmdline, self).update_output(context)
|
||||||
|
if not self.output:
|
||||||
|
return
|
||||||
|
for workload in self.workload:
|
||||||
|
scores = []
|
||||||
|
matches = re.findall(self.workloads[workload] + '(.+\d)', self.output)
|
||||||
|
for match in matches:
|
||||||
|
scores.append(int(re.search(r'\d+', match).group(0)))
|
||||||
|
if self.section == 4:
|
||||||
|
context.add_metric("OpenCL Score " + self.workloads[workload], scores[0])
|
||||||
|
elif self.section == 9:
|
||||||
|
context.add_metric("Vulkan Score " + self.workloads[workload], scores[0])
|
||||||
|
else:
|
||||||
|
context.add_metric("Single-Core Score " + self.workloads[workload], scores[0])
|
||||||
|
if not self.is_single_core:
|
||||||
|
context.add_metric("Multi-Core Score " + self.workloads[workload], scores[1])
|
||||||
|
|
||||||
|
def extract_results(self, context):
|
||||||
|
# Extract results on the target
|
||||||
|
super(GeekbenchCmdline, self).extract_results(context)
|
||||||
|
self.target.pull(self.target_result_json, self.host_result_json)
|
||||||
|
context.add_artifact('GeekbenchCmdline_results', self.host_result_json, kind='raw')
|
||||||
|
|
||||||
|
@once
|
||||||
|
def finalize(self, context):
|
||||||
|
if self.cleanup_assets:
|
||||||
|
self.target.remove(self.target_exec_directory)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user