[RFC] Add AVX2 capability
Commit Message
CPU architectures often gain interesting new instructions as they evolve, but
application developers often find it difficult to take advantage of those
instructions. The idea of this patch is to help distributions to use the AVX2
instructions. In this patch AVX2 capability is provided to glibc, like tls was
implemented.
Signed-off-by: Dimitri John Ledkov <dimitri.j.ledkov@intel.com>
Signed-off-by: Victor Rodriguez <victor.rodriguez.bahena@intel.com>
---
elf/dl-cache.c | 6 +++++-
elf/dl-hwcaps.c | 17 +++++++++++++++++
elf/ldconfig.c | 1 +
3 files changed, 23 insertions(+), 1 deletion(-)
Comments
This sort of thing should be implemented entirely within sysdeps files for
the relevant architecture, not in architecture-independent code. I'm
pretty sure the relevant mechanisms already exist.
@@ -259,8 +259,9 @@ _dl_load_cache_lookup (const char *name)
platform = 1ULL << platform;
#define _DL_HWCAP_TLS_MASK (1LL << 63)
+#define _DL_HWCAP_AVX2_MASK (1LL << 62)
uint64_t hwcap_exclude = ~((GLRO(dl_hwcap) & GLRO(dl_hwcap_mask))
- | _DL_HWCAP_PLATFORM | _DL_HWCAP_TLS_MASK);
+ | _DL_HWCAP_PLATFORM | _DL_HWCAP_TLS_MASK | _DL_HWCAP_AVX2_MASK);
/* Only accept hwcap if it's for the right platform. */
#define HWCAP_CHECK \
@@ -271,6 +272,9 @@ _dl_load_cache_lookup (const char *name)
if (_DL_PLATFORMS_COUNT \
&& (lib->hwcap & _DL_HWCAP_PLATFORM) != 0 \
&& (lib->hwcap & _DL_HWCAP_PLATFORM) != platform) \
+ continue; \
+ if (!HAS_ARCH_FEATURE (AVX2_Usable) && \
+ (lib->hwcap & _DL_HWCAP_AVX2_MASK)) \
continue
SEARCH_CACHE (cache_new);
}
@@ -111,6 +111,9 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
/* For TLS enabled builds always add 'tls'. */
++cnt;
+ /* Add 'avx2' capability on x86_64 */
+ ++cnt;
+
/* Create temporary data structure to generate result table. */
struct r_strlenpair temp[cnt];
m = 0;
@@ -163,6 +166,20 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
temp[m].len = 3;
++m;
+ if (HAS_ARCH_FEATURE (AVX2_Usable))
+ {
+ if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
+ _dl_debug_printf (" adding avx2 cap support\n");
+ temp[m].str = "avx2";
+ temp[m].len = 4;
+ ++m;
+ }
+ else {
+ if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
+ _dl_debug_printf (" not adding avx2 cap support\n");
+ --cnt;
+ }
+
assert (m == cnt);
/* Determine the total size of all strings together. */
@@ -1298,6 +1298,7 @@ main (int argc, char **argv)
under which TLS support was optional. The entry is no longer needed, but
must remain for compatibility. */
hwcap_extra[63 - _DL_FIRST_EXTRA] = "tls";
+ hwcap_extra[62 - _DL_FIRST_EXTRA] = "avx2";
set_hwcap ();