Re: x86 CPU features detection for applications (and AMX)

Thiago Macieira
2021-06-28T19:26:28Z

On Monday, 28 June 2021 12:08:16 PDT Peter Zijlstra wrote:
> > Anyway, if the AMX state is a sticky "set once per process", it's likely
> > going to get set early for every process that *may* use AMX. And this is
> > assuming we do the library right and only set it if has AMX code at all,
> > instead of all the time.
>
> This, AFAIU. If the ifunc() resolver finds we haz AMX it can do the
> prctl() and on success pick the AMX routine.
>
> Assuming of course, that if a program links with a library that supports
> AMX, it will actually end up using it.

That's what I meant and I agree. If it has an AMX function for *anything*, it
will do the arch_prctl() and enable the state, even if said function is never
called.

This is the good case. The bad case is that it does the arch_prctl() before it
sees whether there is any AMX function.

Do we expect that the dynamic loader will have this code? It currently
searches the multiple ABI levels (up to x86-64-v4 to include AVX512) and HW
capabilities. I can readily see AMX being one of the capabilities, if not an
ABI level. Though it should be trivial for it to call the arch_prctl() if and
only if it is about to load an ELF module that declares use of AMX and also
*not* load it if the syscall fails.

$ LD_DEBUG=libs /lib64/ld-linux-x86-64.so.2 --inhibit-cache /bin/ls
1620: find library=librt.so.1 [0]; searching
1620: search path=.....
1620: trying file=/usr/lib64/glibc-hwcaps/x86-64-v4/librt.so.1
1620: trying file=/usr/lib64/glibc-hwcaps/x86-64-v3/librt.so.1
1620: trying file=/usr/lib64/glibc-hwcaps/x86-64-v2/librt.so.1
1620: trying file=/usr/lib64/tls/haswell/avx512_1/x86_64/librt.so.
1
1620: trying file=/usr/lib64/tls/haswell/avx512_1/librt.so.1
1620: trying file=/usr/lib64/tls/haswell/x86_64/librt.so.1
1620: trying file=/usr/lib64/tls/haswell/librt.so.1
1620: trying file=/usr/lib64/tls/avx512_1/x86_64/librt.so.1
1620: trying file=/usr/lib64/tls/avx512_1/librt.so.1
1620: trying file=/usr/lib64/tls/x86_64/librt.so.1
1620: trying file=/usr/lib64/tls/librt.so.1
1620: trying file=/usr/lib64/haswell/avx512_1/x86_64/librt.so.1
1620: trying file=/usr/lib64/haswell/avx512_1/librt.so.1
1620: trying file=/usr/lib64/haswell/x86_64/librt.so.1
1620: trying file=/usr/lib64/haswell/librt.so.1
1620: trying file=/usr/lib64/avx512_1/x86_64/librt.so.1
1620: trying file=/usr/lib64/avx512_1/librt.so.1
1620: trying file=/usr/lib64/x86_64/librt.so.1
1620: trying file=/usr/lib64/librt.so.1

--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel DPG Cloud Engineering