Re: x86 CPU features detection for applications (and AMX)
From: Thiago Macieira <hidden>
Date: 2021-06-28 19:26:28
Also in:
linux-arch
On Monday, 28 June 2021 12:08:16 PDT Peter Zijlstra wrote:
quoted
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