[{"id":28964,"web_url":"https://patchwork.libcamera.org/comment/28964/","msgid":"<20240314155549.2fiyjr7jzpzrtaxh@jasper>","date":"2024-03-14T15:55:49","subject":"Re: [PATCH v5 16/18] libcamera: Add \"Software ISP benchmarking\"\n\tdocumentation","submitter":{"id":184,"url":"https://patchwork.libcamera.org/api/people/184/","name":"Stefan Klug","email":"stefan.klug@ideasonboard.com"},"content":"Hi Hans,\n\nOn Mon, Mar 11, 2024 at 03:15:20PM +0100, Hans de Goede wrote:\n> Add a \"Software ISP benchmarking\" documentation section which describes\n> the performance/power consumption measurements used during\n> the Software ISP's development.\n> \n> Reviewed-by: Milan Zamazal <mzamazal@redhat.com>\n> Signed-off-by: Hans de Goede <hdegoede@redhat.com>\n> ---\n> Changes in v5:\n> - Add \"text\" / \"shell\" as language to the code-block:: directives\n>   to fix build failure with older sphinx versions\n> ---\n>  Documentation/index.rst                     |  1 +\n>  Documentation/meson.build                   |  1 +\n>  Documentation/software-isp-benchmarking.rst | 82 +++++++++++++++++++++\n>  3 files changed, 84 insertions(+)\n>  create mode 100644 Documentation/software-isp-benchmarking.rst\n> \n> diff --git a/Documentation/index.rst b/Documentation/index.rst\n> index 63fac72d..5442ae75 100644\n> --- a/Documentation/index.rst\n> +++ b/Documentation/index.rst\n> @@ -24,3 +24,4 @@\n>     Lens driver requirements <lens_driver_requirements>\n>     Python Bindings <python-bindings>\n>     Camera Sensor Model <camera-sensor-model>\n> +   SoftwareISP Benchmarking <software-isp-benchmarking>\n> diff --git a/Documentation/meson.build b/Documentation/meson.build\n> index 7a58fec8..3872e0a8 100644\n> --- a/Documentation/meson.build\n> +++ b/Documentation/meson.build\n> @@ -80,6 +80,7 @@ if sphinx.found()\n>          'lens_driver_requirements.rst',\n>          'python-bindings.rst',\n>          'sensor_driver_requirements.rst',\n> +        'software-isp-benchmarking.rst',\n>         '../README.rst',\n>      ]\n>  \n> diff --git a/Documentation/software-isp-benchmarking.rst b/Documentation/software-isp-benchmarking.rst\n> new file mode 100644\n> index 00000000..b2803953\n> --- /dev/null\n> +++ b/Documentation/software-isp-benchmarking.rst\n> @@ -0,0 +1,82 @@\n> +.. SPDX-License-Identifier: CC-BY-SA-4.0\n> +\n> +.. _software-isp-benchmarking:\n> +\n> +Software ISP benchmarking\n> +=========================\n> +\n> +The Software ISP is particularly sensitive to performance regressions\n> +therefore it is a good idea to always benchmark the Software ISP\n> +before and after making changes to it and ensure that there are\n> +no performance regressions.\n> +\n> +DebayerCpu class builtin benchmark\n> +----------------------------------\n> +\n> +The DebayerCpu class has a builtin benchmark. This benchmark\n> +measures the time spent on processing (collecting statistics\n> +and debayering) only, it does not measure the time spent on\n> +capturing or outputting the frames.\n> +\n> +The builtin benchmark always runs. So this can be used by simply\n> +running \"cam\" or \"qcam\" with a pipeline using the Software ISP.\n> +\n> +When it runs it will skip measuring the first 30 frames to\n> +allow the caches and the CPU temperature (turbo-ing) to warm-up\n> +and then it measures 30 fps and shows the total and per frame\n> +processing time using an info level log message:\n> +\n> +.. code-block:: text\n> +\n> +   INFO Debayer debayer_cpu.cpp:907 Processed 30 frames in 244317us, 8143 us/frame\n> +\n> +To get stable measurements it is advised to disable any other processes which\n> +may cause significant CPU usage (e.g. disable wifi, bluetooth and browsers).\n> +When possible it is also advisable to disable CPU turbo-ing and\n> +frequency-scaling.\n> +\n> +For example when benchmarking on a Lenovo ThinkPad X1 Yoga Gen 8, with\n> +the charger plugged in, the CPU can be fixed to run at 2 GHz using:\n> +\n> +.. code-block:: shell\n> +\n> +   sudo x86_energy_perf_policy --turbo-enable 0\n> +   sudo cpupower frequency-set -d 2GHz -u 2GHz\n> +\n> +with these settings the builtin bench reports a processing time of ~7.8ms/frame\n> +on this laptop for FHD SGRBG10 (unpacked) bayer data.\n> +\n> +Measuring power consumption\n> +---------------------------\n> +\n> +Since the Software ISP is often used on mobile devices it is also\n> +important to measure power consumption and ensure that that does\n> +not regress.\n> +\n> +For example to measure power consumption on a Lenovo ThinkPad X1 Yoga Gen 8\n> +it needs to be running on battery and it should be configured with its\n> +platform-profile (/sys/firmware/acpi/platform_profile) set to balanced and\n> +with its default turbo and frequency-scaling behavior to match real world usage.\n> +\n> +Then start qcam to capture a FHD picture at 30 fps and position the qcam window\n> +so that it is fully visible. After this run the following command to monitor\n> +the power consumption:\n> +\n> +.. code-block:: shell\n> +\n> +   watch -n 10 cat /sys/class/power_supply/BAT0/power_now /sys/class/hwmon/hwmon6/fan?_input\n> +\n> +Note this not only measures the power consumption in µW it also monitors\n> +the speed of this laptop's 2 fans. This is important because depending on\n> +the ambient temperature the 2 fans may spin up while testing and this\n> +will cause an additional power consumption of approx. 0.5 W messing up\n> +the measurement.\n> +\n> +After starting qcam + the watch command let the laptop sit without using\n> +it for 2 minutes for the readings to stabilize. Then check that the fans\n> +have not turned on and manually take a couple of consecutive power readings\n> +and avarage these.\n\ns/avarage/average/\n\nI'm also no native speaker. With this fixed\n\nReviewed-by: Stefan Klug <stefan.klug@ideasonboard.com> \n\nCheers,\nStefan\n\n> +\n> +On the example Lenovo ThinkPad X1 Yoga Gen 8 laptop this results in\n> +a measured power consumption of approx. 13 W while running qcam versus\n> +approx. 4-5 W while setting idle with its OLED panel on.\n> -- \n> 2.44.0\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id AB270BD160\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 14 Mar 2024 15:55:55 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7FD3C62C87;\n\tThu, 14 Mar 2024 16:55:54 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8BD686286F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 14 Mar 2024 16:55:52 +0100 (CET)","from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:c467:7cd1:67a9:bc4c])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 05F3B55;\n\tThu, 14 Mar 2024 16:55:28 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"UGuh7Moi\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1710431729;\n\tbh=0vDzNK8cJj98DAuHxkDouOMx+16TE5WbqpXnolLIsL8=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=UGuh7MoiXlKgEjRI0JoYYtVyt6pkussiiH5VUm6/vfw9byCknANdE0mDjN7lUY7xb\n\tz2YlY7PPEcC7SI2Lr8Fu1Ov4twqJbEGIzb2yGbl1DRjj3qv2AZSNnyZkzldnrPK7aS\n\t7ylWKJ9PBN8qhVxC9vFNcwIilHLGtKMO5ypgX05Y=","Date":"Thu, 14 Mar 2024 16:55:49 +0100","From":"Stefan Klug <stefan.klug@ideasonboard.com>","To":"Hans de Goede <hdegoede@redhat.com>","Subject":"Re: [PATCH v5 16/18] libcamera: Add \"Software ISP benchmarking\"\n\tdocumentation","Message-ID":"<20240314155549.2fiyjr7jzpzrtaxh@jasper>","References":"<20240311141524.27192-1-hdegoede@redhat.com>\n\t<20240311141524.27192-17-hdegoede@redhat.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20240311141524.27192-17-hdegoede@redhat.com>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>,\n\tlibcamera-devel@lists.libcamera.org, Maxime Ripard <mripard@redhat.com>, \n\tPavel Machek <pavel@ucw.cz>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]