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