libcamera: Add "Software ISP benchmarking" documentation
Add a "Software ISP benchmarking" documentation section which describes the performance/power consumption measurements used during the Software ISP's development. Reviewed-by: Milan Zamazal <mzamazal@redhat.com> Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
09fb65486e
commit
d9b2619e2e
3 changed files with 79 additions and 0 deletions
|
@ -24,3 +24,4 @@
|
||||||
Lens driver requirements <lens_driver_requirements>
|
Lens driver requirements <lens_driver_requirements>
|
||||||
Python Bindings <python-bindings>
|
Python Bindings <python-bindings>
|
||||||
Camera Sensor Model <camera-sensor-model>
|
Camera Sensor Model <camera-sensor-model>
|
||||||
|
SoftwareISP Benchmarking <software-isp-benchmarking>
|
||||||
|
|
|
@ -80,6 +80,7 @@ if sphinx.found()
|
||||||
'lens_driver_requirements.rst',
|
'lens_driver_requirements.rst',
|
||||||
'python-bindings.rst',
|
'python-bindings.rst',
|
||||||
'sensor_driver_requirements.rst',
|
'sensor_driver_requirements.rst',
|
||||||
|
'software-isp-benchmarking.rst',
|
||||||
'../README.rst',
|
'../README.rst',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
77
Documentation/software-isp-benchmarking.rst
Normal file
77
Documentation/software-isp-benchmarking.rst
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
.. SPDX-License-Identifier: CC-BY-SA-4.0
|
||||||
|
|
||||||
|
.. _software-isp-benchmarking:
|
||||||
|
|
||||||
|
Software ISP benchmarking
|
||||||
|
=========================
|
||||||
|
|
||||||
|
The Software ISP is particularly sensitive to performance regressions therefore
|
||||||
|
it is a good idea to always benchmark the Software ISP before and after making
|
||||||
|
changes to it and ensure that there are no performance regressions.
|
||||||
|
|
||||||
|
DebayerCpu class builtin benchmark
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
The DebayerCpu class has a builtin benchmark. This benchmark measures the time
|
||||||
|
spent on processing (collecting statistics and debayering) only, it does not
|
||||||
|
measure the time spent on capturing or outputting the frames.
|
||||||
|
|
||||||
|
The builtin benchmark always runs. So this can be used by simply running "cam"
|
||||||
|
or "qcam" with a pipeline using the Software ISP.
|
||||||
|
|
||||||
|
When it runs it will skip measuring the first 30 frames to allow the caches and
|
||||||
|
the CPU temperature (turbo-ing) to warm-up and then it measures 30 fps and shows
|
||||||
|
the total and per frame processing time using an info level log message:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
INFO Debayer debayer_cpu.cpp:907 Processed 30 frames in 244317us, 8143 us/frame
|
||||||
|
|
||||||
|
To get stable measurements it is advised to disable any other processes which
|
||||||
|
may cause significant CPU usage (e.g. disable wifi, bluetooth and browsers).
|
||||||
|
When possible it is also advisable to disable CPU turbo-ing and
|
||||||
|
frequency-scaling.
|
||||||
|
|
||||||
|
For example when benchmarking on a Lenovo ThinkPad X1 Yoga Gen 8, with the
|
||||||
|
charger plugged in, the CPU can be fixed to run at 2 GHz using:
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
sudo x86_energy_perf_policy --turbo-enable 0
|
||||||
|
sudo cpupower frequency-set -d 2GHz -u 2GHz
|
||||||
|
|
||||||
|
with these settings the builtin bench reports a processing time of ~7.8ms/frame
|
||||||
|
on this laptop for FHD SGRBG10 (unpacked) bayer data.
|
||||||
|
|
||||||
|
Measuring power consumption
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
Since the Software ISP is often used on mobile devices it is also important to
|
||||||
|
measure power consumption and ensure that that does not regress.
|
||||||
|
|
||||||
|
For example to measure power consumption on a Lenovo ThinkPad X1 Yoga Gen 8 it
|
||||||
|
needs to be running on battery and it should be configured with its
|
||||||
|
platform-profile (/sys/firmware/acpi/platform_profile) set to balanced and with
|
||||||
|
its default turbo and frequency-scaling behavior to match real world usage.
|
||||||
|
|
||||||
|
Then start qcam to capture a FHD picture at 30 fps and position the qcam window
|
||||||
|
so that it is fully visible. After this run the following command to monitor the
|
||||||
|
power consumption:
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
watch -n 10 cat /sys/class/power_supply/BAT0/power_now /sys/class/hwmon/hwmon6/fan?_input
|
||||||
|
|
||||||
|
Note this not only measures the power consumption in µW it also monitors the
|
||||||
|
speed of this laptop's 2 fans. This is important because depending on the
|
||||||
|
ambient temperature the 2 fans may spin up while testing and this will cause an
|
||||||
|
additional power consumption of approx. 0.5 W messing up the measurement.
|
||||||
|
|
||||||
|
After starting qcam + the watch command let the laptop sit without using it for
|
||||||
|
2 minutes for the readings to stabilize. Then check that the fans have not
|
||||||
|
turned on and manually take a couple of consecutive power readings and average
|
||||||
|
these.
|
||||||
|
|
||||||
|
On the example Lenovo ThinkPad X1 Yoga Gen 8 laptop this results in a measured
|
||||||
|
power consumption of approx. 13 W while running qcam versus approx. 4-5 W while
|
||||||
|
setting idle with its OLED panel on.
|
Loading…
Add table
Add a link
Reference in a new issue