From patchwork Tue Jan 3 19:53:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Victor Rodriguez X-Patchwork-Id: 18777 Received: (qmail 14605 invoked by alias); 3 Jan 2017 19:53:25 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 14580 invoked by uid 89); 3 Jan 2017 19:53:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-5.1 required=5.0 tests=BAYES_00, RP_MATCHES_RCVD, SPF_PASS, URIBL_RED autolearn=ham version=3.3.2 spammy=cap, Victor, H*r:10.253.24, H*r:sk:orsmga1 X-HELO: mga07.intel.com X-ExtLoop1: 1 From: Victor Rodriguez To: libc-alpha@sourceware.org Cc: Victor Rodriguez Subject: [PATCH] Add avx2 fake-capability, like tls Date: Tue, 3 Jan 2017 19:53:11 +0000 Message-Id: <20170103195311.22870-1-victor.rodriguez.bahena@intel.com> The idea of the patch is to provide AVX2 capability to glibc, original patch from: Dimitri John Ledkov . It has been proved that the use of AVX2 improves the performance of current numerical applications. With this patch the Linux distributions will be able to handle AVX2 in glibc Signed-off-by: Victor Rodriguez --- ChangeLog | 6 ++++++ elf/dl-cache.c | 6 +++++- elf/dl-hwcaps.c | 17 +++++++++++++++++ elf/ldconfig.c | 1 + 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index bbda2a7f2c..8a24afa918 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2016-12-30 Victor Rodriguez + + * elf/dl-cache: Define AVX platform + * elf/dl-hwcaps.c : Adding avx2 cap support + * elf/ldconfig.c : Add avx2 to hwcap_extra + 2016-12-31 Joseph Myers * math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)] diff --git a/elf/dl-cache.c b/elf/dl-cache.c index cfa335eb32..ae5047046d 100644 --- a/elf/dl-cache.c +++ b/elf/dl-cache.c @@ -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); } diff --git a/elf/dl-hwcaps.c b/elf/dl-hwcaps.c index 6004ff264d..4e46b752e7 100644 --- a/elf/dl-hwcaps.c +++ b/elf/dl-hwcaps.c @@ -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. */ diff --git a/elf/ldconfig.c b/elf/ldconfig.c index 467ca8266a..ee2121786c 100644 --- a/elf/ldconfig.c +++ b/elf/ldconfig.c @@ -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 ();