Add avx2 fake-capability, like tls
Commit Message
The idea of the patch is to provide AVX2 capability to glibc, original
patch from: Dimitri John Ledkov <dimitri.j.ledkov@intel.com>.
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 <victor.rodriguez.bahena@intel.com>
---
ChangeLog | 6 ++++++
elf/dl-cache.c | 6 +++++-
elf/dl-hwcaps.c | 17 +++++++++++++++++
elf/ldconfig.c | 1 +
4 files changed, 29 insertions(+), 1 deletion(-)
Comments
On Tue, Jan 3, 2017 at 1:53 PM, Victor Rodriguez
<victor.rodriguez.bahena@intel.com> wrote:
> The idea of the patch is to provide AVX2 capability to glibc, original
> patch from: Dimitri John Ledkov <dimitri.j.ledkov@intel.com>.
> 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 <victor.rodriguez.bahena@intel.com>
> ---
> 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 <victor.rodriguez.bahena@intel.com>
> +
> + * 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 <joseph@codesourcery.com>
>
> * 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 ();
>
> --
> 2.11.0
>
Hi team
Is there any feedback from this ?
Regards
On 03 Jan 2017 19:53, Victor Rodriguez wrote:
> The idea of the patch is to provide AVX2 capability to glibc, original
> patch from: Dimitri John Ledkov <dimitri.j.ledkov@intel.com>.
> 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
i don't think this description is accurate/relevant. looks like you're
trying to add a new search path to ldconfig/ld.so.cache so that people
can build libs w/-mavx2 turned on and then put them under a path e.g.
/lib64/avx2/ ?
you can't add arch-specific functionality to common code like this.
this patch will break all non-x86 arches.
i think you want to actually be updating these files:
sysdeps/i386/dl-procinfo.[ch]
sysdeps/x86_64/dl-procinfo.[ch]
-mike
On 3/16/17, 9:39 PM, "Mike Frysinger" <vapier@gentoo.org> wrote:
>On 03 Jan 2017 19:53, Victor Rodriguez wrote:
>> The idea of the patch is to provide AVX2 capability to glibc, original
>> patch from: Dimitri John Ledkov <dimitri.j.ledkov@intel.com>.
>> 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
>
>i don't think this description is accurate/relevant. looks like you're
>trying to add a new search path to ldconfig/ld.so.cache so that people
>can build libs w/-mavx2 turned on and then put them under a path e.g.
>/lib64/avx2/ ?
>
>you can't add arch-specific functionality to common code like this.
>this patch will break all non-x86 arches.
>
>i think you want to actually be updating these files:
> sysdeps/i386/dl-procinfo.[ch]
> sysdeps/x86_64/dl-procinfo.[ch]
>-mike
Thanks for the feedback , working on V2
>
On Fri, Mar 17, 2017 at 12:18 PM, Rodriguez Bahena, Victor
<victor.rodriguez.bahena@intel.com> wrote:
>
> On 3/16/17, 9:39 PM, "Mike Frysinger" <vapier@gentoo.org> wrote:
>
>>On 03 Jan 2017 19:53, Victor Rodriguez wrote:
>>> The idea of the patch is to provide AVX2 capability to glibc, original
>>> patch from: Dimitri John Ledkov <dimitri.j.ledkov@intel.com>.
>>> 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
>>
>>i don't think this description is accurate/relevant. looks like you're
>>trying to add a new search path to ldconfig/ld.so.cache so that people
>>can build libs w/-mavx2 turned on and then put them under a path e.g.
>>/lib64/avx2/ ?
>>
>>you can't add arch-specific functionality to common code like this.
>>this patch will break all non-x86 arches.
>>
>>i think you want to actually be updating these files:
>> sysdeps/i386/dl-procinfo.[ch]
>> sysdeps/x86_64/dl-procinfo.[ch]
>>-mike
>
> Thanks for the feedback , working on V2
>
>>
Please take a look at hjl/hwcap/master branch at:
https://sourceware.org/git/?p=glibc.git;a=summary
It sets dl_hwcap from CPU features.
@@ -1,3 +1,9 @@
+2016-12-30 Victor Rodriguez <victor.rodriguez.bahena@intel.com>
+
+ * 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 <joseph@codesourcery.com>
* math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)]
@@ -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 ();