* [PATCH 1/3] config/x86: skip GNU binutils bug check for LLVM
2021-11-12 21:48 [PATCH 0/3] config/x86: improve AVX512 availability check Dmitry Kozlyuk
@ 2021-11-12 21:48 ` Dmitry Kozlyuk
2021-11-15 9:17 ` Bruce Richardson
2021-11-12 21:48 ` [PATCH 2/3] buildtools: make AVX512 check script portable Dmitry Kozlyuk
` (2 subsequent siblings)
3 siblings, 1 reply; 8+ messages in thread
From: Dmitry Kozlyuk @ 2021-11-12 21:48 UTC (permalink / raw)
To: dev
Cc: Dmitry Kozlyuk, stable, bruce.richardson, Konstantin Ananyev,
Vladimir Medvedkin
AVX512 was disabled when GNU binutils were missing or had a known bug,
even if LLVM binutils were used for the build,
because binutils-avx512-check.sh was invoked regardless and failed.
In particular, this was the case for FreeBSD with clang (default).
Run the check only when GNU binutils are used.
Fixes: 68b1f1cda5b4 ("build: check AVX512 rather than binutils version")
Cc: stable@dpdk.org
Cc: bruce.richardson@intel.com
Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
---
config/x86/meson.build | 7 ++++---
lib/acl/meson.build | 2 +-
lib/fib/meson.build | 2 +-
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/config/x86/meson.build b/config/x86/meson.build
index 29f3dea181..603359e55a 100644
--- a/config/x86/meson.build
+++ b/config/x86/meson.build
@@ -2,9 +2,10 @@
# Copyright(c) 2017-2020 Intel Corporation
# get binutils version for the workaround of Bug 97
-if not is_windows
- binutils_ok = run_command(binutils_avx512_check)
- if binutils_ok.returncode() != 0 and cc.has_argument('-mno-avx512f')
+binutils_ok = true
+if not is_windows and (is_linux or cc.get_id() == 'gcc')
+ binutils_ok = run_command(binutils_avx512_check).returncode() == 0
+ if not binutils_ok and cc.has_argument('-mno-avx512f')
machine_args += '-mno-avx512f'
warning('Binutils error with AVX512 assembly, disabling AVX512 support')
endif
diff --git a/lib/acl/meson.build b/lib/acl/meson.build
index f3dc513846..fbe17f9454 100644
--- a/lib/acl/meson.build
+++ b/lib/acl/meson.build
@@ -36,7 +36,7 @@ if dpdk_conf.has('RTE_ARCH_X86')
# compile AVX512 version if:
# we are building 64-bit binary AND binutils can generate proper code
- if dpdk_conf.has('RTE_ARCH_X86_64') and binutils_ok.returncode() == 0
+ if dpdk_conf.has('RTE_ARCH_X86_64') and binutils_ok
# compile AVX512 version if either:
# a. we have AVX512 supported in minimum instruction set
diff --git a/lib/fib/meson.build b/lib/fib/meson.build
index 593c8c47c8..9b848d0841 100644
--- a/lib/fib/meson.build
+++ b/lib/fib/meson.build
@@ -14,7 +14,7 @@ deps += ['rib']
# compile AVX512 version if:
# we are building 64-bit binary AND binutils can generate proper code
-if dpdk_conf.has('RTE_ARCH_X86_64') and binutils_ok.returncode() == 0
+if dpdk_conf.has('RTE_ARCH_X86_64') and binutils_ok
# compile AVX512 version if either:
# a. we have AVX512F supported in minimum instruction set baseline
# b. it's not minimum instruction set, but supported by compiler
--
2.29.3
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] config/x86: skip GNU binutils bug check for LLVM
2021-11-12 21:48 ` [PATCH 1/3] config/x86: skip GNU binutils bug check for LLVM Dmitry Kozlyuk
@ 2021-11-15 9:17 ` Bruce Richardson
0 siblings, 0 replies; 8+ messages in thread
From: Bruce Richardson @ 2021-11-15 9:17 UTC (permalink / raw)
To: Dmitry Kozlyuk; +Cc: dev, stable, Konstantin Ananyev, Vladimir Medvedkin
On Sat, Nov 13, 2021 at 12:48:24AM +0300, Dmitry Kozlyuk wrote:
> AVX512 was disabled when GNU binutils were missing or had a known bug,
> even if LLVM binutils were used for the build,
> because binutils-avx512-check.sh was invoked regardless and failed.
> In particular, this was the case for FreeBSD with clang (default).
> Run the check only when GNU binutils are used.
>
> Fixes: 68b1f1cda5b4 ("build: check AVX512 rather than binutils version")
> Cc: stable@dpdk.org
> Cc: bruce.richardson@intel.com
>
> Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/3] buildtools: make AVX512 check script portable
2021-11-12 21:48 [PATCH 0/3] config/x86: improve AVX512 availability check Dmitry Kozlyuk
2021-11-12 21:48 ` [PATCH 1/3] config/x86: skip GNU binutils bug check for LLVM Dmitry Kozlyuk
@ 2021-11-12 21:48 ` Dmitry Kozlyuk
2021-11-15 9:28 ` Bruce Richardson
2021-11-12 21:48 ` [PATCH 3/3] config/x86: fix MinGW cross build with meson 0.49 Dmitry Kozlyuk
2021-11-17 8:42 ` [PATCH 0/3] config/x86: improve AVX512 availability check Thomas Monjalon
3 siblings, 1 reply; 8+ messages in thread
From: Dmitry Kozlyuk @ 2021-11-12 21:48 UTC (permalink / raw)
To: dev; +Cc: Dmitry Kozlyuk, Bruce Richardson, Konstantin Ananyev
buildtools/binutils-avx512-check.sh was Unix-only
and could not be used in cross builds:
1) written in shell;
2) used the assembler binary that may be missing,
e.g. when building on Windows with LLVM;
3) located the assembler as ${AS:-as} and referenced objdump,
but those binaries may be overridden via --cross-file.
Rewrite the script in Python.
Use the C compiler for the check.
Locate objdump and the C compiler using Meson.
Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
---
buildtools/binutils-avx512-check.py | 21 +++++++++++++++++++++
buildtools/binutils-avx512-check.sh | 16 ----------------
buildtools/meson.build | 4 +++-
3 files changed, 24 insertions(+), 17 deletions(-)
create mode 100644 buildtools/binutils-avx512-check.py
delete mode 100755 buildtools/binutils-avx512-check.sh
diff --git a/buildtools/binutils-avx512-check.py b/buildtools/binutils-avx512-check.py
new file mode 100644
index 0000000000..a4e14f3593
--- /dev/null
+++ b/buildtools/binutils-avx512-check.py
@@ -0,0 +1,21 @@
+#! /usr/bin/env python3
+# SPDX-License-Identitifer: BSD-3-Clause
+# Copyright(c) 2020 Intel Corporation
+
+import subprocess
+import sys
+import tempfile
+
+objdump, *cc = sys.argv[1:]
+with tempfile.NamedTemporaryFile() as obj:
+ # On Windows, the file is opened exclusively and is not writable.
+ obj.close()
+ # from https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90028
+ gather_params = '0x8(,%ymm1,1),%ymm0{%k2}'
+ src = '__asm__("vpgatherqq {}");'.format(gather_params).encode('utf-8')
+ subprocess.run(cc + ['-c', '-xc', '-o', obj.name, '-'], input=src, check=True)
+ asm = subprocess.run([objdump, '-d', '--no-show-raw-insn', obj.name],
+ capture_output=True, check=True).stdout.decode('utf-8')
+ if gather_params not in asm:
+ print('vpgatherqq displacement error with as')
+ sys.exit(1)
diff --git a/buildtools/binutils-avx512-check.sh b/buildtools/binutils-avx512-check.sh
deleted file mode 100755
index 2a833b64b7..0000000000
--- a/buildtools/binutils-avx512-check.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#! /bin/sh
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2020 Intel Corporation
-
-AS=${AS:-as}
-OBJFILE=$(mktemp -t dpdk.binutils-check.XXXXXX)
-trap 'rm -f "$OBJFILE"' EXIT
-# from https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90028
-GATHER_PARAMS='0x8(,%ymm1,1),%ymm0{%k2}'
-
-# assemble vpgather to file and similarly check
-echo "vpgatherqq $GATHER_PARAMS" | $AS --64 -o $OBJFILE -
-objdump -d --no-show-raw-insn $OBJFILE | grep -q $GATHER_PARAMS || {
- echo "vpgatherqq displacement error with as"
- exit 1
-}
diff --git a/buildtools/meson.build b/buildtools/meson.build
index f776316da1..22ea0ba375 100644
--- a/buildtools/meson.build
+++ b/buildtools/meson.build
@@ -4,7 +4,7 @@
pkgconf = find_program('pkg-config', 'pkgconf', required: false)
check_symbols = find_program('check-symbols.sh')
ldflags_ibverbs_static = find_program('options-ibverbs-static.sh')
-binutils_avx512_check = find_program('binutils-avx512-check.sh')
+objdump = find_program('objdump', 'llvm-objdump')
python3 = import('python').find_installation(required: false)
if python3.found()
@@ -18,6 +18,8 @@ map_to_win_cmd = py3 + files('map_to_win.py')
sphinx_wrapper = py3 + files('call-sphinx-build.py')
get_cpu_count_cmd = py3 + files('get-cpu-count.py')
get_numa_count_cmd = py3 + files('get-numa-count.py')
+binutils_avx512_check = (py3 + files('binutils-avx512-check.py') +
+ [objdump] + cc.cmd_array())
# select library and object file format
pmdinfo = py3 + files('gen-pmdinfo-cfile.py') + [meson.current_build_dir()]
--
2.29.3
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] buildtools: make AVX512 check script portable
2021-11-12 21:48 ` [PATCH 2/3] buildtools: make AVX512 check script portable Dmitry Kozlyuk
@ 2021-11-15 9:28 ` Bruce Richardson
0 siblings, 0 replies; 8+ messages in thread
From: Bruce Richardson @ 2021-11-15 9:28 UTC (permalink / raw)
To: Dmitry Kozlyuk; +Cc: dev, Konstantin Ananyev
On Sat, Nov 13, 2021 at 12:48:25AM +0300, Dmitry Kozlyuk wrote:
> buildtools/binutils-avx512-check.sh was Unix-only
> and could not be used in cross builds:
> 1) written in shell;
> 2) used the assembler binary that may be missing,
> e.g. when building on Windows with LLVM;
> 3) located the assembler as ${AS:-as} and referenced objdump,
> but those binaries may be overridden via --cross-file.
>
> Rewrite the script in Python.
> Use the C compiler for the check.
> Locate objdump and the C compiler using Meson.
>
> Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
> ---
> buildtools/binutils-avx512-check.py | 21 +++++++++++++++++++++
> buildtools/binutils-avx512-check.sh | 16 ----------------
> buildtools/meson.build | 4 +++-
> 3 files changed, 24 insertions(+), 17 deletions(-)
> create mode 100644 buildtools/binutils-avx512-check.py
> delete mode 100755 buildtools/binutils-avx512-check.sh
>
> diff --git a/buildtools/binutils-avx512-check.py b/buildtools/binutils-avx512-check.py
> new file mode 100644
> index 0000000000..a4e14f3593
> --- /dev/null
> +++ b/buildtools/binutils-avx512-check.py
> @@ -0,0 +1,21 @@
> +#! /usr/bin/env python3
> +# SPDX-License-Identitifer: BSD-3-Clause
> +# Copyright(c) 2020 Intel Corporation
> +
This probably should have your own copyright instead of or alongside the
Intel one, since this is a rewrite.
Otherwise:
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/3] config/x86: fix MinGW cross build with meson 0.49
2021-11-12 21:48 [PATCH 0/3] config/x86: improve AVX512 availability check Dmitry Kozlyuk
2021-11-12 21:48 ` [PATCH 1/3] config/x86: skip GNU binutils bug check for LLVM Dmitry Kozlyuk
2021-11-12 21:48 ` [PATCH 2/3] buildtools: make AVX512 check script portable Dmitry Kozlyuk
@ 2021-11-12 21:48 ` Dmitry Kozlyuk
2021-11-15 9:30 ` Bruce Richardson
2021-11-17 8:42 ` [PATCH 0/3] config/x86: improve AVX512 availability check Thomas Monjalon
3 siblings, 1 reply; 8+ messages in thread
From: Dmitry Kozlyuk @ 2021-11-12 21:48 UTC (permalink / raw)
To: dev; +Cc: Dmitry Kozlyuk, leyi.rong, Bruce Richardson, Konstantin Ananyev
Cross build with MinGW was broken for the baseline meson 0.49.2.
Cause: in c_args = '-mno-avx512f' from config/x86/cross-mingw,
each character was treated as a separate compiler option:
meson.build:4:0: ERROR: Compiler x86_64-w64-mingw32-gcc can not compile programs.
With c_args = ['-mno-avx512f'] configuration passed, but build failed,
because Meson placed -mno-avx512f after -mavx512f in CFLAGS:
In file included from /usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include/immintrin.h:55,
from /usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include/x86intrin.h:32,
from ../dpdk/lib/net/net_crc_avx512.c:13:
/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include/avx512fintrin.h:1650:1:
error: inlining failed in call to always_inline _mm512_ternarylogic_epi64:
target specific option mismatch
1650 | _mm512_ternarylogic_epi64 (__m512i __A, __m512i __B, __m512i __C,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
../dpdk/lib/net/net_crc_avx512.c:59:9: note: called from here
59 | return _mm512_ternarylogic_epi64(tmp0, tmp1, data_block, 0x96);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Additionally, -m[no-]avx512f flag is expected to be in machine_args
by all the checks in meson.build files.
Commit 419c6e9af69e ("net/i40e: fix build for Windows MinGW")
fixed the errors cause by MinGW using AVX512F on Windows.
The binutils AVX512F bug check is now portable,
so enable it for Windows to switch AVX512 support on and off
without any special logic for MinGW.
Fixes: 549bfc83168f ("config: disable AVX512 with MinGW")
Cc: leyi.rong@intel.com
Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
---
config/x86/cross-mingw | 4 +---
config/x86/meson.build | 2 +-
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/config/x86/cross-mingw b/config/x86/cross-mingw
index 48a82b457e..09f7af0928 100644
--- a/config/x86/cross-mingw
+++ b/config/x86/cross-mingw
@@ -5,12 +5,10 @@ ld = 'x86_64-w64-mingw32-ld'
ar = 'x86_64-w64-mingw32-ar'
strip = 'x86_64-w64-mingw32-strip'
pkgconfig = 'x86_64-w64-mingw32-pkg-config'
+objdump = 'x86_64-w64-mingw32-objdump'
[host_machine]
system = 'windows'
cpu_family = 'x86_64'
cpu = 'native'
endian = 'little'
-
-[properties]
-c_args = '-mno-avx512f'
diff --git a/config/x86/meson.build b/config/x86/meson.build
index 603359e55a..e25ed316f4 100644
--- a/config/x86/meson.build
+++ b/config/x86/meson.build
@@ -3,7 +3,7 @@
# get binutils version for the workaround of Bug 97
binutils_ok = true
-if not is_windows and (is_linux or cc.get_id() == 'gcc')
+if is_linux or cc.get_id() == 'gcc'
binutils_ok = run_command(binutils_avx512_check).returncode() == 0
if not binutils_ok and cc.has_argument('-mno-avx512f')
machine_args += '-mno-avx512f'
--
2.29.3
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 3/3] config/x86: fix MinGW cross build with meson 0.49
2021-11-12 21:48 ` [PATCH 3/3] config/x86: fix MinGW cross build with meson 0.49 Dmitry Kozlyuk
@ 2021-11-15 9:30 ` Bruce Richardson
0 siblings, 0 replies; 8+ messages in thread
From: Bruce Richardson @ 2021-11-15 9:30 UTC (permalink / raw)
To: Dmitry Kozlyuk; +Cc: dev, leyi.rong, Konstantin Ananyev
On Sat, Nov 13, 2021 at 12:48:26AM +0300, Dmitry Kozlyuk wrote:
> Cross build with MinGW was broken for the baseline meson 0.49.2.
> Cause: in c_args = '-mno-avx512f' from config/x86/cross-mingw,
> each character was treated as a separate compiler option:
>
> meson.build:4:0: ERROR: Compiler x86_64-w64-mingw32-gcc can not compile programs.
>
> With c_args = ['-mno-avx512f'] configuration passed, but build failed,
> because Meson placed -mno-avx512f after -mavx512f in CFLAGS:
>
> In file included from /usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include/immintrin.h:55,
> from /usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include/x86intrin.h:32,
> from ../dpdk/lib/net/net_crc_avx512.c:13:
> /usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include/avx512fintrin.h:1650:1:
> error: inlining failed in call to always_inline _mm512_ternarylogic_epi64:
> target specific option mismatch
> 1650 | _mm512_ternarylogic_epi64 (__m512i __A, __m512i __B, __m512i __C,
> | ^~~~~~~~~~~~~~~~~~~~~~~~~
> ../dpdk/lib/net/net_crc_avx512.c:59:9: note: called from here
> 59 | return _mm512_ternarylogic_epi64(tmp0, tmp1, data_block, 0x96);
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> Additionally, -m[no-]avx512f flag is expected to be in machine_args
> by all the checks in meson.build files.
>
> Commit 419c6e9af69e ("net/i40e: fix build for Windows MinGW")
> fixed the errors cause by MinGW using AVX512F on Windows.
> The binutils AVX512F bug check is now portable,
> so enable it for Windows to switch AVX512 support on and off
> without any special logic for MinGW.
>
> Fixes: 549bfc83168f ("config: disable AVX512 with MinGW")
> Cc: leyi.rong@intel.com
>
> Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
> ---
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 0/3] config/x86: improve AVX512 availability check
2021-11-12 21:48 [PATCH 0/3] config/x86: improve AVX512 availability check Dmitry Kozlyuk
` (2 preceding siblings ...)
2021-11-12 21:48 ` [PATCH 3/3] config/x86: fix MinGW cross build with meson 0.49 Dmitry Kozlyuk
@ 2021-11-17 8:42 ` Thomas Monjalon
3 siblings, 0 replies; 8+ messages in thread
From: Thomas Monjalon @ 2021-11-17 8:42 UTC (permalink / raw)
To: Dmitry Kozlyuk; +Cc: dev, bruce.richardson
12/11/2021 22:48, Dmitry Kozlyuk:
> The goal of this series is to enable cross-compilation
> of Windows binaries from Linux using MinGW with Meson 0.49 used in CI.
> It also aims to reduce difference between Unix and Windows build code.
>
> AVX512 was switched off for MinGW cross builds,
> but unfortunately in a way that is not usable with meson 0.49.
> Also, c_args was used instead of machine_args for -mno-avx512f.
> After patch 3/3, AVX512 support for MinGW cross builds
> is configured exactly the same way as for Unix builds.
> This required rewriting a Unix-specific script in patch 2/3.
> Patch 1/3 skips check of GNU binutils when LLVM suite is used:
> it is useful in general [1], and also simplifies patch 2/3.
>
> [1]: https://inbox.dpdk.org/dev/20211112160837.131994aa@sovereign
>
> Dmitry Kozlyuk (3):
> config/x86: skip GNU binutils bug check for LLVM
> buildtools: make AVX512 check script portable
> config/x86: fix MinGW cross build with meson 0.49
Applied, thanks.
Note 1: MAINTAINERS was updated for the new script.
Note 2: patch 3 cannot be backported without patch 2, so no Cc:stable on purpose.
^ permalink raw reply [flat|nested] 8+ messages in thread