[PATCH] X86-64: Add _dl_runtime_resolve_avx[512]_opt [BZ #20508]
H.J. Lu
hjl.tools@gmail.com
Tue Aug 23 21:53:00 GMT 2016
There is transition penalty when SSE instructions are mixed with 256-bit
AVX or 512-bit AVX512 load instructions. Since _dl_runtime_resolve_avx
and _dl_runtime_profile_avx512 save/restore 256-bit YMM/512-bit ZMM
registers, there is transition penalty when SSE instructions are used
with lazy binding on AVX and AVX512 processors.
For AVX and AVX512 processors which support XGETBV with ECX == 1, we can
use XGETBV with ECX == 1 to check if the upper 128 bits of YMM registers
or the upper 256 bits of ZMM registers are zero. We can restore only the
non-zero portion of vector registers with AVX/AVX512 load instructions
which will zero-extend upper bits of vector registers.
This patch adds _dl_runtime_resolve_sse_vex which saves and restores
XMM registers with 128-bit AVX store/load instructions. It is used to
preserve YMM/ZMM registers when only the lower 128 bits are non-zero.
_dl_runtime_resolve_avx_opt and _dl_runtime_resolve_avx512_opt are added
and used on AVX/AVX512 processors supporting XGETBV with ECX == 1 so
that we store and load only the non-zero portion of vector registers.
This avoids SSE transition penalty caused by _dl_runtime_resolve_avx and
_dl_runtime_profile_avx512 when only the lower 128 bits of vector
registers are used.
Tested on x86-64 with/without AVX/AVX512. OK for master?
[BZ #20508]
* sysdeps/x86/cpu-features.c (init_cpu_features): Set
Use_dl_runtime_resolve_opt if XGETBV suports ECX == 1.
* sysdeps/x86/cpu-features.h (bit_arch_Use_dl_runtime_resolve_opt):
New.
(index_arch_Use_dl_runtime_resolve_opt): Likewise.
* sysdeps/x86_64/dl-machine.h (elf_machine_runtime_setup): Use
_dl_runtime_resolve_avx512_opt and _dl_runtime_resolve_avx_opt
if Use_dl_runtime_resolve_opt is set.
* sysdeps/x86_64/dl-trampoline.S: Include <cpu-features.h>.
(_dl_runtime_resolve_opt): New. Defined for AVX and AVX512.
(_dl_runtime_resolve): Add one for _dl_runtime_resolve_sse_vex.
* sysdeps/x86_64/dl-trampoline.h (_dl_runtime_resolve_opt): New.
(_dl_runtime_profile): Define only if _dl_runtime_profile is
defined.
--
H.J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-X86-64-Add-_dl_runtime_resolve_avx-512-_opt-BZ-20508.patch
Type: text/x-patch
Size: 10471 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/libc-alpha/attachments/20160823/5cb41cf1/attachment.bin>
More information about the Libc-alpha
mailing list