about summary refs log tree commit diff
path: root/users/flokli/ipu6-softisp/libcamera/0017-libcamera-Add-Software-ISP-benchmarking-documentatio.patch
blob: 2343e9c46fe8149adc14980661bd9df896e4bf99 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
From 6c509a3d144d46a11454d32d128d16e16602b50f Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Mon, 11 Mar 2024 15:15:20 +0100
Subject: [PATCH 17/21] 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>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
---
 Documentation/index.rst                     |  1 +
 Documentation/meson.build                   |  1 +
 Documentation/software-isp-benchmarking.rst | 82 +++++++++++++++++++++
 3 files changed, 84 insertions(+)
 create mode 100644 Documentation/software-isp-benchmarking.rst

diff --git a/Documentation/index.rst b/Documentation/index.rst
index 63fac72d..5442ae75 100644
--- a/Documentation/index.rst
+++ b/Documentation/index.rst
@@ -24,3 +24,4 @@
    Lens driver requirements <lens_driver_requirements>
    Python Bindings <python-bindings>
    Camera Sensor Model <camera-sensor-model>
+   SoftwareISP Benchmarking <software-isp-benchmarking>
diff --git a/Documentation/meson.build b/Documentation/meson.build
index 7a58fec8..3872e0a8 100644
--- a/Documentation/meson.build
+++ b/Documentation/meson.build
@@ -80,6 +80,7 @@ if sphinx.found()
         'lens_driver_requirements.rst',
         'python-bindings.rst',
         'sensor_driver_requirements.rst',
+        'software-isp-benchmarking.rst',
        '../README.rst',
     ]
 
diff --git a/Documentation/software-isp-benchmarking.rst b/Documentation/software-isp-benchmarking.rst
new file mode 100644
index 00000000..b2803953
--- /dev/null
+++ b/Documentation/software-isp-benchmarking.rst
@@ -0,0 +1,82 @@
+.. 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 avarage 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.
-- 
2.43.2