From: "Rémi Denis-Courmont" <remi@remlab.net>
To: ffmpeg-devel@ffmpeg.org
Subject: Re: [FFmpeg-devel] [PATCH v2 3/5] aarch64: Add Linux runtime cpu feature detection using getauxval(AT_HWCAP)
Date: Wed, 31 May 2023 19:54:01 +0300
Message-ID: <3789008.K3ae2cLcPR@basile.remlab.net> (raw)
In-Reply-To: <20230530123043.52940-3-martin@martin.st>
Le tiistaina 30. toukokuuta 2023, 15.30.41 EEST Martin Storsjö a écrit :
> Based partially on code by Janne Grunau.
>
> ---
> Updated to use both the direct HWCAP* macros and HWCAP_CPUID. A
> not unreasonably old distribution like Ubuntu 20.04 does have
> HWCAP_CPUID but not HWCAP2_I8MM in the distribution provided headers.
>
> Alternatively I guess we could carry our own fallback hardcoded values
> for the HWCAP* values we use and skip HWCAP_CPUID.
> ---
> configure | 2 ++
> libavutil/aarch64/cpu.c | 63 +++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 65 insertions(+)
>
> diff --git a/configure b/configure
> index 50eb27ba0e..b39de74de5 100755
> --- a/configure
> +++ b/configure
> @@ -2209,6 +2209,7 @@ HAVE_LIST_PUB="
>
> HEADERS_LIST="
> arpa_inet_h
> + asm_hwcap_h
> asm_types_h
> cdio_paranoia_h
> cdio_paranoia_paranoia_h
> @@ -6432,6 +6433,7 @@ check_headers io.h
> enabled libdrm &&
> check_headers linux/dma-buf.h
>
> +check_headers asm/hwcap.h
> check_headers linux/perf_event.h
> check_headers libcrystalhd/libcrystalhd_if.h
> check_headers malloc.h
> diff --git a/libavutil/aarch64/cpu.c b/libavutil/aarch64/cpu.c
> index 0c76f5ad15..4563959ffd 100644
> --- a/libavutil/aarch64/cpu.c
> +++ b/libavutil/aarch64/cpu.c
> @@ -20,6 +20,67 @@
> #include "libavutil/cpu_internal.h"
> #include "config.h"
>
> +#if (defined(__linux__) || defined(__ANDROID__)) && HAVE_GETAUXVAL &&
> HAVE_ASM_HWCAP_H +#include <stdint.h>
> +#include <asm/hwcap.h>
> +#include <sys/auxv.h>
> +
> +#define get_cpu_feature_reg(reg, val) \
> + __asm__("mrs %0, " #reg : "=r" (val))
> +
> +static int detect_flags(void)
> +{
> + int flags = 0;
> + unsigned long hwcap, hwcap2;
> +
> + // Check for support using direct individual HWCAPs
> + hwcap = getauxval(AT_HWCAP);
> +#ifdef HWCAP_ASIMDDP
> + if (hwcap & HWCAP_ASIMDDP)
> + flags |= AV_CPU_FLAG_DOTPROD;
> +#endif
> +
> +#ifdef AT_HWCAP2
> + hwcap2 = getauxval(AT_HWCAP2);
> +#ifdef HWCAP2_I8MM
> + if (hwcap2 & HWCAP2_I8MM)
> + flags |= AV_CPU_FLAG_I8MM;
> +#endif
> +#endif
> +
> + // Silence warnings if none of the hwcaps to check are known.
> + (void)hwcap;
> + (void)hwcap2;
> +
> +#if defined(HWCAP_CPUID)
> + // The HWCAP_* defines for individual extensions may become available
> late, as
> + // they require updates to userland headers. As a fallback, see if we
can access
> + // the CPUID registers (trapped via the kernel).
> + // See https://www.kernel.org/doc/html/latest/arm64/cpu-feature-registers.html
I don't actually care which method is used and whether to hard-code the
missing constants or not. But doing both methods is weird. If you are going to
trigger the TID3 traps anyway, there is no point checking the auxillary
vectors before, AFAICT.
You *could* check the auxillary vectors as a run-time fallback if HWCAP_CPUID
is *not* set, but that only really makes for HWCAP_FP and HWCAP_ASIMD, not for
HWCAP_ASIMDDP (Linux 4.15) and HWCAP2_I8MM (Linux 5.6) which are more recent
than HWCAP_CPUID (Linux 4.11). And then, that would be only in the corner case
that FP and/or AdvSIMD were explicitly disabled since they are on by default
for all AArch64 targets.
--
Реми Дёни-Курмон
http://www.remlab.net/
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2023-05-31 16:54 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-30 12:30 [FFmpeg-devel] [PATCH v2 1/5] configure: aarch64: Support assembling the dotprod and i8mm arch extensions Martin Storsjö
2023-05-30 12:30 ` [FFmpeg-devel] [PATCH v2 2/5] aarch64: Add cpu flags for the dotprod and i8mm extensions Martin Storsjö
2023-05-30 12:30 ` [FFmpeg-devel] [PATCH v2 3/5] aarch64: Add Linux runtime cpu feature detection using getauxval(AT_HWCAP) Martin Storsjö
2023-05-31 16:54 ` Rémi Denis-Courmont [this message]
2023-05-31 19:37 ` Martin Storsjö
2023-05-30 12:30 ` [FFmpeg-devel] [PATCH v2 4/5] aarch64: Add Apple runtime detection of dotprod and i8mm using sysctl Martin Storsjö
2023-05-30 12:30 ` [FFmpeg-devel] [PATCH v2 5/5] aarch64: Add Windows runtime detection of the dotprod instructions Martin Storsjö
2023-06-03 20:51 ` Martin Storsjö
2023-06-05 17:36 ` James Zern
2023-06-06 9:32 ` Martin Storsjö
2023-06-06 10:25 ` [FFmpeg-devel] [PATCH v2 1/5] configure: aarch64: Support assembling the dotprod and i8mm arch extensions Martin Storsjö
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3789008.K3ae2cLcPR@basile.remlab.net \
--to=remi@remlab.net \
--cc=ffmpeg-devel@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git