* [PATCH 0/3] remove driver-specific logic for AVX builds @ 2025-03-14 17:23 Bruce Richardson 2025-03-14 17:23 ` [PATCH 1/3] build: add generalized AVX handling for drivers Bruce Richardson ` (3 more replies) 0 siblings, 4 replies; 11+ messages in thread From: Bruce Richardson @ 2025-03-14 17:23 UTC (permalink / raw) To: dev; +Cc: david.marchand, Bruce Richardson A number of drivers had special optimized AVX2 and AVX512 code paths for performance reasons, and these tended to have copy-pasted logic to build those files. Centralise that logic in the main drivers/meson.build file to avoid duplication. Bruce Richardson (3): build: add generalized AVX handling for drivers net/intel: use common AVX build code drivers/net: build use common AVX handling drivers/meson.build | 30 ++++++++++++++++++++++++++++++ drivers/net/bnxt/meson.build | 10 +--------- drivers/net/enic/meson.build | 10 +--------- drivers/net/intel/i40e/meson.build | 26 ++------------------------ drivers/net/intel/iavf/meson.build | 25 ++----------------------- drivers/net/intel/ice/meson.build | 25 ++----------------------- drivers/net/intel/idpf/meson.build | 25 ++----------------------- drivers/net/nfp/meson.build | 10 +--------- drivers/net/octeon_ep/meson.build | 14 ++------------ drivers/net/virtio/meson.build | 9 +-------- 10 files changed, 44 insertions(+), 140 deletions(-) -- 2.43.0 ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/3] build: add generalized AVX handling for drivers 2025-03-14 17:23 [PATCH 0/3] remove driver-specific logic for AVX builds Bruce Richardson @ 2025-03-14 17:23 ` Bruce Richardson 2025-03-14 17:23 ` [PATCH 2/3] net/intel: use common AVX build code Bruce Richardson ` (2 subsequent siblings) 3 siblings, 0 replies; 11+ messages in thread From: Bruce Richardson @ 2025-03-14 17:23 UTC (permalink / raw) To: dev; +Cc: david.marchand, Bruce Richardson Add support to the top-level driver build file for AVX2 and AVX512 specific sources. This should simplify driver builds by avoiding the need to constantly reimplement the same build logic Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- drivers/meson.build | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/meson.build b/drivers/meson.build index 05391a575d..c42c7764bf 100644 --- a/drivers/meson.build +++ b/drivers/meson.build @@ -126,6 +126,8 @@ foreach subpath:subdirs name = drv annotate_locks = true sources = [] + sources_avx2 = [] + sources_avx512 = [] headers = [] driver_sdk_headers = [] # public headers included by drivers objs = [] @@ -235,6 +237,34 @@ foreach subpath:subdirs dpdk_includes += include_directories(drv_path) endif + # handle avx2 and avx512 source files + if arch_subdir == 'x86' + if sources_avx2.length() > 0 + avx2_lib = static_library(lib_name + '_avx2_lib', + sources_avx2, + dependencies: static_deps, + include_directories: includes, + c_args: [cflags, cc_avx2_flags]) + objs += avx2_lib.extract_objects(sources_avx2) + endif + if sources_avx512.length() > 0 + cflags += '-DCC_AVX512_SUPPORT' + avx512_args = [cflags, cc_avx512_flags] + if cc.has_argument('-march=skylake-avx512') + avx512_args += '-march=skylake-avx512' + if cc.has_argument('-Wno-overriding-option') + avx512_args += '-Wno-overriding-option' + endif + endif + avx512_lib = static_library(lib_name + '_avx512_lib', + sources_avx512, + dependencies: static_deps, + include_directories: includes, + c_args: avx512_args) + objs += avx512_lib.extract_objects(sources_avx512) + endif + endif + # generate pmdinfo sources by building a temporary # lib and then running pmdinfogen on the contents of # that lib. The final lib reuses the object files and -- 2.43.0 ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 2/3] net/intel: use common AVX build code 2025-03-14 17:23 [PATCH 0/3] remove driver-specific logic for AVX builds Bruce Richardson 2025-03-14 17:23 ` [PATCH 1/3] build: add generalized AVX handling for drivers Bruce Richardson @ 2025-03-14 17:23 ` Bruce Richardson 2025-03-14 17:23 ` [PATCH 3/3] drivers/net: build use common AVX handling Bruce Richardson 2025-03-14 17:44 ` [PATCH v2 0/4] remove driver-specific logic for AVX builds Bruce Richardson 3 siblings, 0 replies; 11+ messages in thread From: Bruce Richardson @ 2025-03-14 17:23 UTC (permalink / raw) To: dev Cc: david.marchand, Bruce Richardson, Ian Stokes, Vladimir Medvedkin, Anatoly Burakov, Jingjing Wu, Praveen Shetty Remove driver-specific build instructions for the AVX2 and AVX-512 code, and rely instead on the generic driver build file. Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- drivers/net/intel/i40e/meson.build | 26 ++------------------------ drivers/net/intel/iavf/meson.build | 25 ++----------------------- drivers/net/intel/ice/meson.build | 25 ++----------------------- drivers/net/intel/idpf/meson.build | 25 ++----------------------- 4 files changed, 8 insertions(+), 93 deletions(-) diff --git a/drivers/net/intel/i40e/meson.build b/drivers/net/intel/i40e/meson.build index 2973ed1a01..25a3d72714 100644 --- a/drivers/net/intel/i40e/meson.build +++ b/drivers/net/intel/i40e/meson.build @@ -40,35 +40,13 @@ includes += include_directories('base') if arch_subdir == 'x86' sources += files('i40e_rxtx_vec_sse.c') + sources_avx2 = files('i40e_rxtx_vec_avx2.c') + sources_avx512 = files('i40e_rxtx_vec_avx512.c') if is_windows and cc.get_id() != 'clang' cflags += ['-fno-asynchronous-unwind-tables'] endif - i40e_avx2_lib = static_library('i40e_avx2_lib', - 'i40e_rxtx_vec_avx2.c', - dependencies: [static_rte_ethdev, static_rte_kvargs, static_rte_hash], - include_directories: includes, - c_args: [cflags, cc_avx2_flags]) - objs += i40e_avx2_lib.extract_objects('i40e_rxtx_vec_avx2.c') - - if cc_has_avx512 - cflags += ['-DCC_AVX512_SUPPORT'] - avx512_args = cflags + cc_avx512_flags - if cc.has_argument('-march=skylake-avx512') - avx512_args += '-march=skylake-avx512' - if cc.has_argument('-Wno-overriding-option') - avx512_args += '-Wno-overriding-option' - endif - endif - i40e_avx512_lib = static_library('i40e_avx512_lib', - 'i40e_rxtx_vec_avx512.c', - dependencies: [static_rte_ethdev, - static_rte_kvargs, static_rte_hash], - include_directories: includes, - c_args: avx512_args) - objs += i40e_avx512_lib.extract_objects('i40e_rxtx_vec_avx512.c') - endif elif arch_subdir == 'ppc' sources += files('i40e_rxtx_vec_altivec.c') elif arch_subdir == 'arm' diff --git a/drivers/net/intel/iavf/meson.build b/drivers/net/intel/iavf/meson.build index f7eac7c57a..fc3e4d2f28 100644 --- a/drivers/net/intel/iavf/meson.build +++ b/drivers/net/intel/iavf/meson.build @@ -28,34 +28,13 @@ includes += include_directories('base') if arch_subdir == 'x86' sources += files('iavf_rxtx_vec_sse.c') + sources_avx2 = files('iavf_rxtx_vec_avx2.c') + sources_avx512 = files('iavf_rxtx_vec_avx512.c') if is_windows and cc.get_id() != 'clang' cflags += ['-fno-asynchronous-unwind-tables'] endif - iavf_avx2_lib = static_library('iavf_avx2_lib', - 'iavf_rxtx_vec_avx2.c', - dependencies: [static_rte_ethdev], - include_directories: includes, - c_args: [cflags, cc_avx2_flags]) - objs += iavf_avx2_lib.extract_objects('iavf_rxtx_vec_avx2.c') - - if cc_has_avx512 - cflags += ['-DCC_AVX512_SUPPORT'] - avx512_args = cflags + cc_avx512_flags - if cc.has_argument('-march=skylake-avx512') - avx512_args += '-march=skylake-avx512' - if cc.has_argument('-Wno-overriding-option') - avx512_args += '-Wno-overriding-option' - endif - endif - iavf_avx512_lib = static_library('iavf_avx512_lib', - 'iavf_rxtx_vec_avx512.c', - dependencies: [static_rte_ethdev], - include_directories: includes, - c_args: avx512_args) - objs += iavf_avx512_lib.extract_objects('iavf_rxtx_vec_avx512.c') - endif elif arch_subdir == 'arm' sources += files('iavf_rxtx_vec_neon.c') endif diff --git a/drivers/net/intel/ice/meson.build b/drivers/net/intel/ice/meson.build index cbdf38c1c4..a33ec59272 100644 --- a/drivers/net/intel/ice/meson.build +++ b/drivers/net/intel/ice/meson.build @@ -34,34 +34,13 @@ endif if arch_subdir == 'x86' sources += files('ice_rxtx_vec_sse.c') + sources_avx2 = files('ice_rxtx_vec_avx2.c') + sources_avx512 = files('ice_rxtx_vec_avx512.c') if is_windows and cc.get_id() != 'clang' cflags += ['-fno-asynchronous-unwind-tables'] endif - ice_avx2_lib = static_library('ice_avx2_lib', - 'ice_rxtx_vec_avx2.c', - dependencies: [static_rte_ethdev, static_rte_hash], - include_directories: includes, - c_args: [cflags, cc_avx2_flags]) - objs += ice_avx2_lib.extract_objects('ice_rxtx_vec_avx2.c') - - if cc_has_avx512 - cflags += ['-DCC_AVX512_SUPPORT'] - avx512_args = cflags + cc_avx512_flags - if cc.has_argument('-march=skylake-avx512') - avx512_args += '-march=skylake-avx512' - if cc.has_argument('-Wno-overriding-option') - avx512_args += '-Wno-overriding-option' - endif - endif - ice_avx512_lib = static_library('ice_avx512_lib', - 'ice_rxtx_vec_avx512.c', - dependencies: [static_rte_ethdev, static_rte_hash], - include_directories: includes, - c_args: avx512_args) - objs += ice_avx512_lib.extract_objects('ice_rxtx_vec_avx512.c') - endif endif sources += files( diff --git a/drivers/net/intel/idpf/meson.build b/drivers/net/intel/idpf/meson.build index 4b272d02b1..10465f0f36 100644 --- a/drivers/net/intel/idpf/meson.build +++ b/drivers/net/intel/idpf/meson.build @@ -19,29 +19,8 @@ sources = files( ) if arch_subdir == 'x86' and dpdk_conf.get('RTE_IOVA_IN_MBUF') == 1 - idpf_avx2_lib = static_library('idpf_avx2_lib', - 'idpf_common_rxtx_avx2.c', - dependencies: [static_rte_ethdev, static_rte_hash], - include_directories: includes, - c_args: [cflags, cc_avx2_flags]) - objs += idpf_avx2_lib.extract_objects('idpf_common_rxtx_avx2.c') - - if cc_has_avx512 - cflags += ['-DCC_AVX512_SUPPORT'] - avx512_args = cflags + cc_avx512_flags - if cc.has_argument('-march=skylake-avx512') - avx512_args += '-march=skylake-avx512' - if cc.has_argument('-Wno-overriding-option') - avx512_args += '-Wno-overriding-option' - endif - endif - idpf_common_avx512_lib = static_library('idpf_common_avx512_lib', - 'idpf_common_rxtx_avx512.c', - dependencies: static_rte_mbuf, - include_directories: includes, - c_args: avx512_args) - objs += idpf_common_avx512_lib.extract_objects('idpf_common_rxtx_avx512.c') - endif + sources_avx2 = files('idpf_common_rxtx_avx2.c') + sources_avx512 = files('idpf_common_rxtx_avx512.c') endif subdir('base') -- 2.43.0 ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 3/3] drivers/net: build use common AVX handling 2025-03-14 17:23 [PATCH 0/3] remove driver-specific logic for AVX builds Bruce Richardson 2025-03-14 17:23 ` [PATCH 1/3] build: add generalized AVX handling for drivers Bruce Richardson 2025-03-14 17:23 ` [PATCH 2/3] net/intel: use common AVX build code Bruce Richardson @ 2025-03-14 17:23 ` Bruce Richardson 2025-03-14 17:31 ` David Marchand 2025-03-14 17:44 ` [PATCH v2 0/4] remove driver-specific logic for AVX builds Bruce Richardson 3 siblings, 1 reply; 11+ messages in thread From: Bruce Richardson @ 2025-03-14 17:23 UTC (permalink / raw) To: dev Cc: david.marchand, Bruce Richardson, Ajit Khaparde, Somnath Kotur, John Daley, Hyong Youb Kim, Chaoyong He, Vamsi Attunuru, Maxime Coquelin, Chenbo Xia Remove from remaining net drivers the special-case code to handle AVX2 or AVX512 specific files. These can be built instead using drivers/meson.build. Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- drivers/net/bnxt/meson.build | 10 +--------- drivers/net/enic/meson.build | 10 +--------- drivers/net/nfp/meson.build | 10 +--------- drivers/net/octeon_ep/meson.build | 14 ++------------ drivers/net/virtio/meson.build | 9 +-------- 5 files changed, 6 insertions(+), 47 deletions(-) diff --git a/drivers/net/bnxt/meson.build b/drivers/net/bnxt/meson.build index fd82d0c409..dcca7df916 100644 --- a/drivers/net/bnxt/meson.build +++ b/drivers/net/bnxt/meson.build @@ -58,15 +58,7 @@ subdir('hcapi/cfa_v3') if arch_subdir == 'x86' sources += files('bnxt_rxtx_vec_sse.c') - # build AVX2 code with instruction set explicitly enabled for runtime selection - bnxt_avx2_lib = static_library('bnxt_avx2_lib', - 'bnxt_rxtx_vec_avx2.c', - dependencies: [static_rte_ethdev, - static_rte_bus_pci, - static_rte_kvargs, static_rte_hash], - include_directories: includes, - c_args: [cflags, cc_avx2_flags]) - objs += bnxt_avx2_lib.extract_objects('bnxt_rxtx_vec_avx2.c') + sources_avx2 = files('bnxt_rxtx_vec_avx2.c') elif arch_subdir == 'arm' and dpdk_conf.get('RTE_ARCH_64') sources += files('bnxt_rxtx_vec_neon.c') endif diff --git a/drivers/net/enic/meson.build b/drivers/net/enic/meson.build index cfe5ec170a..2b3052fae8 100644 --- a/drivers/net/enic/meson.build +++ b/drivers/net/enic/meson.build @@ -29,17 +29,9 @@ sources = files( deps += ['hash'] includes += include_directories('base') -# Build the avx2 handler for 64-bit X86 targets, even though 'machine' -# may not. This is to support users who build for the min supported machine -# and need to run the binary on newer CPUs too. if dpdk_conf.has('RTE_ARCH_X86_64') cflags += '-DENIC_RXTX_VEC' - enic_avx2_lib = static_library('enic_avx2_lib', - 'enic_rxtx_vec_avx2.c', - dependencies: [static_rte_ethdev, static_rte_bus_pci], - include_directories: includes, - c_args: [cflags, cc_avx2_flags]) - objs += enic_avx2_lib.extract_objects('enic_rxtx_vec_avx2.c') + sources_avx2 = files('enic_rxtx_vec_avx2.c') endif annotate_locks = false diff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build index 0a12b7dce7..a98b584042 100644 --- a/drivers/net/nfp/meson.build +++ b/drivers/net/nfp/meson.build @@ -52,19 +52,11 @@ cflags += no_wvla_cflag if arch_subdir == 'x86' includes += include_directories('../../common/nfp') - avx2_sources = files( + sources_avx2 = files( 'nfdk/nfp_nfdk_vec_avx2_dp.c', 'nfp_rxtx_vec_avx2.c', ) - nfp_avx2_lib = static_library('nfp_avx2_lib', - avx2_sources, - dependencies: [static_rte_ethdev, static_rte_bus_pci], - include_directories: includes, - c_args: [cflags, cc_avx2_flags] - ) - - objs += nfp_avx2_lib.extract_all_objects(recursive: true) else sources += files( 'nfp_rxtx_vec_stub.c', diff --git a/drivers/net/octeon_ep/meson.build b/drivers/net/octeon_ep/meson.build index 1b34db3edc..9bf4627894 100644 --- a/drivers/net/octeon_ep/meson.build +++ b/drivers/net/octeon_ep/meson.build @@ -15,18 +15,8 @@ sources = files( if arch_subdir == 'x86' sources += files('cnxk_ep_rx_sse.c') - if cc.get_define('__AVX2__', args: machine_args) != '' - cflags += ['-DCC_AVX2_SUPPORT'] - sources += files('cnxk_ep_rx_avx.c') - elif cc.has_multi_arguments(cc_avx2_flags) - cflags += ['-DCC_AVX2_SUPPORT'] - otx_ep_avx2_lib = static_library('otx_ep_avx2_lib', - 'cnxk_ep_rx_avx.c', - dependencies: [static_rte_ethdev, static_rte_pci, static_rte_bus_pci], - include_directories: includes, - c_args: [cflags, cc_avx2_flags]) - objs += otx_ep_avx2_lib.extract_objects('cnxk_ep_rx_avx.c') - endif + cflags += ['-DCC_AVX2_SUPPORT'] + sources_avx2 = files('cnxk_ep_rx_avx.c') endif if arch_subdir == 'arm' diff --git a/drivers/net/virtio/meson.build b/drivers/net/virtio/meson.build index c1c4a85bea..01bfb3c47d 100644 --- a/drivers/net/virtio/meson.build +++ b/drivers/net/virtio/meson.build @@ -27,15 +27,8 @@ cflags += no_wvla_cflag if arch_subdir == 'x86' if cc_has_avx512 - cflags += ['-DCC_AVX512_SUPPORT'] cflags += ['-DVIRTIO_RXTX_PACKED_VEC'] - virtio_avx512_lib = static_library('virtio_avx512_lib', - 'virtio_rxtx_packed.c', - dependencies: [static_rte_ethdev, - static_rte_kvargs, static_rte_bus_pci], - include_directories: includes, - c_args: cflags + cc_avx512_flags) - objs += virtio_avx512_lib.extract_objects('virtio_rxtx_packed.c') + sources_avx512 = files('virtio_rxtx_packed.c') if (toolchain == 'gcc' and cc.version().version_compare('>=8.3.0')) cflags += '-DVIRTIO_GCC_UNROLL_PRAGMA' elif (toolchain == 'clang' and cc.version().version_compare('>=3.7.0')) -- 2.43.0 ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/3] drivers/net: build use common AVX handling 2025-03-14 17:23 ` [PATCH 3/3] drivers/net: build use common AVX handling Bruce Richardson @ 2025-03-14 17:31 ` David Marchand 2025-03-14 17:37 ` Bruce Richardson 0 siblings, 1 reply; 11+ messages in thread From: David Marchand @ 2025-03-14 17:31 UTC (permalink / raw) To: Bruce Richardson Cc: dev, Ajit Khaparde, Somnath Kotur, John Daley, Hyong Youb Kim, Chaoyong He, Vamsi Attunuru, Maxime Coquelin, Chenbo Xia On Fri, Mar 14, 2025 at 6:24 PM Bruce Richardson <bruce.richardson@intel.com> wrote: > diff --git a/drivers/net/octeon_ep/meson.build b/drivers/net/octeon_ep/meson.build > index 1b34db3edc..9bf4627894 100644 > --- a/drivers/net/octeon_ep/meson.build > +++ b/drivers/net/octeon_ep/meson.build > @@ -15,18 +15,8 @@ sources = files( > > if arch_subdir == 'x86' > sources += files('cnxk_ep_rx_sse.c') > - if cc.get_define('__AVX2__', args: machine_args) != '' > - cflags += ['-DCC_AVX2_SUPPORT'] > - sources += files('cnxk_ep_rx_avx.c') > - elif cc.has_multi_arguments(cc_avx2_flags) > - cflags += ['-DCC_AVX2_SUPPORT'] > - otx_ep_avx2_lib = static_library('otx_ep_avx2_lib', > - 'cnxk_ep_rx_avx.c', > - dependencies: [static_rte_ethdev, static_rte_pci, static_rte_bus_pci], > - include_directories: includes, > - c_args: [cflags, cc_avx2_flags]) > - objs += otx_ep_avx2_lib.extract_objects('cnxk_ep_rx_avx.c') > - endif > + cflags += ['-DCC_AVX2_SUPPORT'] Could it be set by drivers/meson.build? Similarly to AVX512. > + sources_avx2 = files('cnxk_ep_rx_avx.c') > endif > > if arch_subdir == 'arm' -- David Marchand ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/3] drivers/net: build use common AVX handling 2025-03-14 17:31 ` David Marchand @ 2025-03-14 17:37 ` Bruce Richardson 0 siblings, 0 replies; 11+ messages in thread From: Bruce Richardson @ 2025-03-14 17:37 UTC (permalink / raw) To: David Marchand Cc: dev, Ajit Khaparde, Somnath Kotur, John Daley, Hyong Youb Kim, Chaoyong He, Vamsi Attunuru, Maxime Coquelin, Chenbo Xia On Fri, Mar 14, 2025 at 06:31:08PM +0100, David Marchand wrote: > On Fri, Mar 14, 2025 at 6:24 PM Bruce Richardson > <bruce.richardson@intel.com> wrote: > > diff --git a/drivers/net/octeon_ep/meson.build b/drivers/net/octeon_ep/meson.build > > index 1b34db3edc..9bf4627894 100644 > > --- a/drivers/net/octeon_ep/meson.build > > +++ b/drivers/net/octeon_ep/meson.build > > @@ -15,18 +15,8 @@ sources = files( > > > > if arch_subdir == 'x86' > > sources += files('cnxk_ep_rx_sse.c') > > - if cc.get_define('__AVX2__', args: machine_args) != '' > > - cflags += ['-DCC_AVX2_SUPPORT'] > > - sources += files('cnxk_ep_rx_avx.c') > > - elif cc.has_multi_arguments(cc_avx2_flags) > > - cflags += ['-DCC_AVX2_SUPPORT'] > > - otx_ep_avx2_lib = static_library('otx_ep_avx2_lib', > > - 'cnxk_ep_rx_avx.c', > > - dependencies: [static_rte_ethdev, static_rte_pci, static_rte_bus_pci], > > - include_directories: includes, > > - c_args: [cflags, cc_avx2_flags]) > > - objs += otx_ep_avx2_lib.extract_objects('cnxk_ep_rx_avx.c') > > - endif > > + cflags += ['-DCC_AVX2_SUPPORT'] > > Could it be set by drivers/meson.build? > Similarly to AVX512. > Yes, but really I'd rather see it removed. It's now the same as the defines for x86, since we always build AVX2 support when building for x86, because all compilers we support can generate AVX2 code. /Bruce ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v2 0/4] remove driver-specific logic for AVX builds 2025-03-14 17:23 [PATCH 0/3] remove driver-specific logic for AVX builds Bruce Richardson ` (2 preceding siblings ...) 2025-03-14 17:23 ` [PATCH 3/3] drivers/net: build use common AVX handling Bruce Richardson @ 2025-03-14 17:44 ` Bruce Richardson 2025-03-14 17:44 ` [PATCH v2 1/4] build: add generalized AVX handling for drivers Bruce Richardson ` (3 more replies) 3 siblings, 4 replies; 11+ messages in thread From: Bruce Richardson @ 2025-03-14 17:44 UTC (permalink / raw) To: dev; +Cc: david.marchand, Bruce Richardson A number of drivers had special optimized AVX2 and AVX512 code paths for performance reasons, and these tended to have copy-pasted logic to build those files. Centralise that logic in the main drivers/meson.build file to avoid duplication. v2: add patch 4 to remove use of unnecessary CC_AVX2_SUPPORT flag Bruce Richardson (4): build: add generalized AVX handling for drivers net/intel: use common AVX build code drivers/net: build use common AVX handling drivers/net: remove AVX2 build-time define drivers/meson.build | 30 +++++++++++++++++++++++++++ drivers/net/bnxt/bnxt_ethdev.c | 2 -- drivers/net/bnxt/meson.build | 10 +-------- drivers/net/enic/meson.build | 10 +-------- drivers/net/intel/i40e/meson.build | 26 ++--------------------- drivers/net/intel/iavf/meson.build | 25 ++-------------------- drivers/net/intel/ice/meson.build | 25 ++-------------------- drivers/net/intel/idpf/meson.build | 25 ++-------------------- drivers/net/nfp/meson.build | 10 +-------- drivers/net/octeon_ep/meson.build | 13 +----------- drivers/net/octeon_ep/otx_ep_ethdev.c | 4 ---- drivers/net/virtio/meson.build | 9 +------- 12 files changed, 43 insertions(+), 146 deletions(-) -- 2.43.0 ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v2 1/4] build: add generalized AVX handling for drivers 2025-03-14 17:44 ` [PATCH v2 0/4] remove driver-specific logic for AVX builds Bruce Richardson @ 2025-03-14 17:44 ` Bruce Richardson 2025-03-14 17:44 ` [PATCH v2 2/4] net/intel: use common AVX build code Bruce Richardson ` (2 subsequent siblings) 3 siblings, 0 replies; 11+ messages in thread From: Bruce Richardson @ 2025-03-14 17:44 UTC (permalink / raw) To: dev; +Cc: david.marchand, Bruce Richardson Add support to the top-level driver build file for AVX2 and AVX512 specific sources. This should simplify driver builds by avoiding the need to constantly reimplement the same build logic Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- drivers/meson.build | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/meson.build b/drivers/meson.build index 05391a575d..c42c7764bf 100644 --- a/drivers/meson.build +++ b/drivers/meson.build @@ -126,6 +126,8 @@ foreach subpath:subdirs name = drv annotate_locks = true sources = [] + sources_avx2 = [] + sources_avx512 = [] headers = [] driver_sdk_headers = [] # public headers included by drivers objs = [] @@ -235,6 +237,34 @@ foreach subpath:subdirs dpdk_includes += include_directories(drv_path) endif + # handle avx2 and avx512 source files + if arch_subdir == 'x86' + if sources_avx2.length() > 0 + avx2_lib = static_library(lib_name + '_avx2_lib', + sources_avx2, + dependencies: static_deps, + include_directories: includes, + c_args: [cflags, cc_avx2_flags]) + objs += avx2_lib.extract_objects(sources_avx2) + endif + if sources_avx512.length() > 0 + cflags += '-DCC_AVX512_SUPPORT' + avx512_args = [cflags, cc_avx512_flags] + if cc.has_argument('-march=skylake-avx512') + avx512_args += '-march=skylake-avx512' + if cc.has_argument('-Wno-overriding-option') + avx512_args += '-Wno-overriding-option' + endif + endif + avx512_lib = static_library(lib_name + '_avx512_lib', + sources_avx512, + dependencies: static_deps, + include_directories: includes, + c_args: avx512_args) + objs += avx512_lib.extract_objects(sources_avx512) + endif + endif + # generate pmdinfo sources by building a temporary # lib and then running pmdinfogen on the contents of # that lib. The final lib reuses the object files and -- 2.43.0 ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v2 2/4] net/intel: use common AVX build code 2025-03-14 17:44 ` [PATCH v2 0/4] remove driver-specific logic for AVX builds Bruce Richardson 2025-03-14 17:44 ` [PATCH v2 1/4] build: add generalized AVX handling for drivers Bruce Richardson @ 2025-03-14 17:44 ` Bruce Richardson 2025-03-14 17:44 ` [PATCH v2 3/4] drivers/net: build use common AVX handling Bruce Richardson 2025-03-14 17:44 ` [PATCH v2 4/4] drivers/net: remove AVX2 build-time define Bruce Richardson 3 siblings, 0 replies; 11+ messages in thread From: Bruce Richardson @ 2025-03-14 17:44 UTC (permalink / raw) To: dev Cc: david.marchand, Bruce Richardson, Ian Stokes, Vladimir Medvedkin, Anatoly Burakov, Jingjing Wu, Praveen Shetty Remove driver-specific build instructions for the AVX2 and AVX-512 code, and rely instead on the generic driver build file. Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- drivers/net/intel/i40e/meson.build | 26 ++------------------------ drivers/net/intel/iavf/meson.build | 25 ++----------------------- drivers/net/intel/ice/meson.build | 25 ++----------------------- drivers/net/intel/idpf/meson.build | 25 ++----------------------- 4 files changed, 8 insertions(+), 93 deletions(-) diff --git a/drivers/net/intel/i40e/meson.build b/drivers/net/intel/i40e/meson.build index 2973ed1a01..25a3d72714 100644 --- a/drivers/net/intel/i40e/meson.build +++ b/drivers/net/intel/i40e/meson.build @@ -40,35 +40,13 @@ includes += include_directories('base') if arch_subdir == 'x86' sources += files('i40e_rxtx_vec_sse.c') + sources_avx2 = files('i40e_rxtx_vec_avx2.c') + sources_avx512 = files('i40e_rxtx_vec_avx512.c') if is_windows and cc.get_id() != 'clang' cflags += ['-fno-asynchronous-unwind-tables'] endif - i40e_avx2_lib = static_library('i40e_avx2_lib', - 'i40e_rxtx_vec_avx2.c', - dependencies: [static_rte_ethdev, static_rte_kvargs, static_rte_hash], - include_directories: includes, - c_args: [cflags, cc_avx2_flags]) - objs += i40e_avx2_lib.extract_objects('i40e_rxtx_vec_avx2.c') - - if cc_has_avx512 - cflags += ['-DCC_AVX512_SUPPORT'] - avx512_args = cflags + cc_avx512_flags - if cc.has_argument('-march=skylake-avx512') - avx512_args += '-march=skylake-avx512' - if cc.has_argument('-Wno-overriding-option') - avx512_args += '-Wno-overriding-option' - endif - endif - i40e_avx512_lib = static_library('i40e_avx512_lib', - 'i40e_rxtx_vec_avx512.c', - dependencies: [static_rte_ethdev, - static_rte_kvargs, static_rte_hash], - include_directories: includes, - c_args: avx512_args) - objs += i40e_avx512_lib.extract_objects('i40e_rxtx_vec_avx512.c') - endif elif arch_subdir == 'ppc' sources += files('i40e_rxtx_vec_altivec.c') elif arch_subdir == 'arm' diff --git a/drivers/net/intel/iavf/meson.build b/drivers/net/intel/iavf/meson.build index f7eac7c57a..fc3e4d2f28 100644 --- a/drivers/net/intel/iavf/meson.build +++ b/drivers/net/intel/iavf/meson.build @@ -28,34 +28,13 @@ includes += include_directories('base') if arch_subdir == 'x86' sources += files('iavf_rxtx_vec_sse.c') + sources_avx2 = files('iavf_rxtx_vec_avx2.c') + sources_avx512 = files('iavf_rxtx_vec_avx512.c') if is_windows and cc.get_id() != 'clang' cflags += ['-fno-asynchronous-unwind-tables'] endif - iavf_avx2_lib = static_library('iavf_avx2_lib', - 'iavf_rxtx_vec_avx2.c', - dependencies: [static_rte_ethdev], - include_directories: includes, - c_args: [cflags, cc_avx2_flags]) - objs += iavf_avx2_lib.extract_objects('iavf_rxtx_vec_avx2.c') - - if cc_has_avx512 - cflags += ['-DCC_AVX512_SUPPORT'] - avx512_args = cflags + cc_avx512_flags - if cc.has_argument('-march=skylake-avx512') - avx512_args += '-march=skylake-avx512' - if cc.has_argument('-Wno-overriding-option') - avx512_args += '-Wno-overriding-option' - endif - endif - iavf_avx512_lib = static_library('iavf_avx512_lib', - 'iavf_rxtx_vec_avx512.c', - dependencies: [static_rte_ethdev], - include_directories: includes, - c_args: avx512_args) - objs += iavf_avx512_lib.extract_objects('iavf_rxtx_vec_avx512.c') - endif elif arch_subdir == 'arm' sources += files('iavf_rxtx_vec_neon.c') endif diff --git a/drivers/net/intel/ice/meson.build b/drivers/net/intel/ice/meson.build index cbdf38c1c4..a33ec59272 100644 --- a/drivers/net/intel/ice/meson.build +++ b/drivers/net/intel/ice/meson.build @@ -34,34 +34,13 @@ endif if arch_subdir == 'x86' sources += files('ice_rxtx_vec_sse.c') + sources_avx2 = files('ice_rxtx_vec_avx2.c') + sources_avx512 = files('ice_rxtx_vec_avx512.c') if is_windows and cc.get_id() != 'clang' cflags += ['-fno-asynchronous-unwind-tables'] endif - ice_avx2_lib = static_library('ice_avx2_lib', - 'ice_rxtx_vec_avx2.c', - dependencies: [static_rte_ethdev, static_rte_hash], - include_directories: includes, - c_args: [cflags, cc_avx2_flags]) - objs += ice_avx2_lib.extract_objects('ice_rxtx_vec_avx2.c') - - if cc_has_avx512 - cflags += ['-DCC_AVX512_SUPPORT'] - avx512_args = cflags + cc_avx512_flags - if cc.has_argument('-march=skylake-avx512') - avx512_args += '-march=skylake-avx512' - if cc.has_argument('-Wno-overriding-option') - avx512_args += '-Wno-overriding-option' - endif - endif - ice_avx512_lib = static_library('ice_avx512_lib', - 'ice_rxtx_vec_avx512.c', - dependencies: [static_rte_ethdev, static_rte_hash], - include_directories: includes, - c_args: avx512_args) - objs += ice_avx512_lib.extract_objects('ice_rxtx_vec_avx512.c') - endif endif sources += files( diff --git a/drivers/net/intel/idpf/meson.build b/drivers/net/intel/idpf/meson.build index 4b272d02b1..10465f0f36 100644 --- a/drivers/net/intel/idpf/meson.build +++ b/drivers/net/intel/idpf/meson.build @@ -19,29 +19,8 @@ sources = files( ) if arch_subdir == 'x86' and dpdk_conf.get('RTE_IOVA_IN_MBUF') == 1 - idpf_avx2_lib = static_library('idpf_avx2_lib', - 'idpf_common_rxtx_avx2.c', - dependencies: [static_rte_ethdev, static_rte_hash], - include_directories: includes, - c_args: [cflags, cc_avx2_flags]) - objs += idpf_avx2_lib.extract_objects('idpf_common_rxtx_avx2.c') - - if cc_has_avx512 - cflags += ['-DCC_AVX512_SUPPORT'] - avx512_args = cflags + cc_avx512_flags - if cc.has_argument('-march=skylake-avx512') - avx512_args += '-march=skylake-avx512' - if cc.has_argument('-Wno-overriding-option') - avx512_args += '-Wno-overriding-option' - endif - endif - idpf_common_avx512_lib = static_library('idpf_common_avx512_lib', - 'idpf_common_rxtx_avx512.c', - dependencies: static_rte_mbuf, - include_directories: includes, - c_args: avx512_args) - objs += idpf_common_avx512_lib.extract_objects('idpf_common_rxtx_avx512.c') - endif + sources_avx2 = files('idpf_common_rxtx_avx2.c') + sources_avx512 = files('idpf_common_rxtx_avx512.c') endif subdir('base') -- 2.43.0 ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v2 3/4] drivers/net: build use common AVX handling 2025-03-14 17:44 ` [PATCH v2 0/4] remove driver-specific logic for AVX builds Bruce Richardson 2025-03-14 17:44 ` [PATCH v2 1/4] build: add generalized AVX handling for drivers Bruce Richardson 2025-03-14 17:44 ` [PATCH v2 2/4] net/intel: use common AVX build code Bruce Richardson @ 2025-03-14 17:44 ` Bruce Richardson 2025-03-14 17:44 ` [PATCH v2 4/4] drivers/net: remove AVX2 build-time define Bruce Richardson 3 siblings, 0 replies; 11+ messages in thread From: Bruce Richardson @ 2025-03-14 17:44 UTC (permalink / raw) To: dev Cc: david.marchand, Bruce Richardson, Ajit Khaparde, Somnath Kotur, John Daley, Hyong Youb Kim, Chaoyong He, Vamsi Attunuru, Maxime Coquelin, Chenbo Xia Remove from remaining net drivers the special-case code to handle AVX2 or AVX512 specific files. These can be built instead using drivers/meson.build. Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- drivers/net/bnxt/meson.build | 10 +--------- drivers/net/enic/meson.build | 10 +--------- drivers/net/nfp/meson.build | 10 +--------- drivers/net/octeon_ep/meson.build | 14 ++------------ drivers/net/virtio/meson.build | 9 +-------- 5 files changed, 6 insertions(+), 47 deletions(-) diff --git a/drivers/net/bnxt/meson.build b/drivers/net/bnxt/meson.build index fd82d0c409..dcca7df916 100644 --- a/drivers/net/bnxt/meson.build +++ b/drivers/net/bnxt/meson.build @@ -58,15 +58,7 @@ subdir('hcapi/cfa_v3') if arch_subdir == 'x86' sources += files('bnxt_rxtx_vec_sse.c') - # build AVX2 code with instruction set explicitly enabled for runtime selection - bnxt_avx2_lib = static_library('bnxt_avx2_lib', - 'bnxt_rxtx_vec_avx2.c', - dependencies: [static_rte_ethdev, - static_rte_bus_pci, - static_rte_kvargs, static_rte_hash], - include_directories: includes, - c_args: [cflags, cc_avx2_flags]) - objs += bnxt_avx2_lib.extract_objects('bnxt_rxtx_vec_avx2.c') + sources_avx2 = files('bnxt_rxtx_vec_avx2.c') elif arch_subdir == 'arm' and dpdk_conf.get('RTE_ARCH_64') sources += files('bnxt_rxtx_vec_neon.c') endif diff --git a/drivers/net/enic/meson.build b/drivers/net/enic/meson.build index cfe5ec170a..2b3052fae8 100644 --- a/drivers/net/enic/meson.build +++ b/drivers/net/enic/meson.build @@ -29,17 +29,9 @@ sources = files( deps += ['hash'] includes += include_directories('base') -# Build the avx2 handler for 64-bit X86 targets, even though 'machine' -# may not. This is to support users who build for the min supported machine -# and need to run the binary on newer CPUs too. if dpdk_conf.has('RTE_ARCH_X86_64') cflags += '-DENIC_RXTX_VEC' - enic_avx2_lib = static_library('enic_avx2_lib', - 'enic_rxtx_vec_avx2.c', - dependencies: [static_rte_ethdev, static_rte_bus_pci], - include_directories: includes, - c_args: [cflags, cc_avx2_flags]) - objs += enic_avx2_lib.extract_objects('enic_rxtx_vec_avx2.c') + sources_avx2 = files('enic_rxtx_vec_avx2.c') endif annotate_locks = false diff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build index 0a12b7dce7..a98b584042 100644 --- a/drivers/net/nfp/meson.build +++ b/drivers/net/nfp/meson.build @@ -52,19 +52,11 @@ cflags += no_wvla_cflag if arch_subdir == 'x86' includes += include_directories('../../common/nfp') - avx2_sources = files( + sources_avx2 = files( 'nfdk/nfp_nfdk_vec_avx2_dp.c', 'nfp_rxtx_vec_avx2.c', ) - nfp_avx2_lib = static_library('nfp_avx2_lib', - avx2_sources, - dependencies: [static_rte_ethdev, static_rte_bus_pci], - include_directories: includes, - c_args: [cflags, cc_avx2_flags] - ) - - objs += nfp_avx2_lib.extract_all_objects(recursive: true) else sources += files( 'nfp_rxtx_vec_stub.c', diff --git a/drivers/net/octeon_ep/meson.build b/drivers/net/octeon_ep/meson.build index 1b34db3edc..9bf4627894 100644 --- a/drivers/net/octeon_ep/meson.build +++ b/drivers/net/octeon_ep/meson.build @@ -15,18 +15,8 @@ sources = files( if arch_subdir == 'x86' sources += files('cnxk_ep_rx_sse.c') - if cc.get_define('__AVX2__', args: machine_args) != '' - cflags += ['-DCC_AVX2_SUPPORT'] - sources += files('cnxk_ep_rx_avx.c') - elif cc.has_multi_arguments(cc_avx2_flags) - cflags += ['-DCC_AVX2_SUPPORT'] - otx_ep_avx2_lib = static_library('otx_ep_avx2_lib', - 'cnxk_ep_rx_avx.c', - dependencies: [static_rte_ethdev, static_rte_pci, static_rte_bus_pci], - include_directories: includes, - c_args: [cflags, cc_avx2_flags]) - objs += otx_ep_avx2_lib.extract_objects('cnxk_ep_rx_avx.c') - endif + cflags += ['-DCC_AVX2_SUPPORT'] + sources_avx2 = files('cnxk_ep_rx_avx.c') endif if arch_subdir == 'arm' diff --git a/drivers/net/virtio/meson.build b/drivers/net/virtio/meson.build index c1c4a85bea..01bfb3c47d 100644 --- a/drivers/net/virtio/meson.build +++ b/drivers/net/virtio/meson.build @@ -27,15 +27,8 @@ cflags += no_wvla_cflag if arch_subdir == 'x86' if cc_has_avx512 - cflags += ['-DCC_AVX512_SUPPORT'] cflags += ['-DVIRTIO_RXTX_PACKED_VEC'] - virtio_avx512_lib = static_library('virtio_avx512_lib', - 'virtio_rxtx_packed.c', - dependencies: [static_rte_ethdev, - static_rte_kvargs, static_rte_bus_pci], - include_directories: includes, - c_args: cflags + cc_avx512_flags) - objs += virtio_avx512_lib.extract_objects('virtio_rxtx_packed.c') + sources_avx512 = files('virtio_rxtx_packed.c') if (toolchain == 'gcc' and cc.version().version_compare('>=8.3.0')) cflags += '-DVIRTIO_GCC_UNROLL_PRAGMA' elif (toolchain == 'clang' and cc.version().version_compare('>=3.7.0')) -- 2.43.0 ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v2 4/4] drivers/net: remove AVX2 build-time define 2025-03-14 17:44 ` [PATCH v2 0/4] remove driver-specific logic for AVX builds Bruce Richardson ` (2 preceding siblings ...) 2025-03-14 17:44 ` [PATCH v2 3/4] drivers/net: build use common AVX handling Bruce Richardson @ 2025-03-14 17:44 ` Bruce Richardson 3 siblings, 0 replies; 11+ messages in thread From: Bruce Richardson @ 2025-03-14 17:44 UTC (permalink / raw) To: dev Cc: david.marchand, Bruce Richardson, Ajit Khaparde, Somnath Kotur, Vamsi Attunuru Since all supported compilers can generate AVX2 code, we will always enable the build of the AVX2 files on x86. This means that CC_AVX2_SUPPORT is always true on x86, so it can be removed and a regular "#ifdef RTE_ARCH_x86" used in its place. Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- drivers/net/bnxt/bnxt_ethdev.c | 2 -- drivers/net/octeon_ep/meson.build | 1 - drivers/net/octeon_ep/otx_ep_ethdev.c | 4 ---- 3 files changed, 7 deletions(-) diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 144d4377bd..a318604c20 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -3238,8 +3238,6 @@ static const struct { #if defined(RTE_ARCH_X86) {bnxt_crx_pkts_vec, "Vector SSE"}, {bnxt_recv_pkts_vec, "Vector SSE"}, -#endif -#if defined(RTE_ARCH_X86) && defined(CC_AVX2_SUPPORT) {bnxt_crx_pkts_vec_avx2, "Vector AVX2"}, {bnxt_recv_pkts_vec_avx2, "Vector AVX2"}, #endif diff --git a/drivers/net/octeon_ep/meson.build b/drivers/net/octeon_ep/meson.build index 9bf4627894..a4a7663d1d 100644 --- a/drivers/net/octeon_ep/meson.build +++ b/drivers/net/octeon_ep/meson.build @@ -15,7 +15,6 @@ sources = files( if arch_subdir == 'x86' sources += files('cnxk_ep_rx_sse.c') - cflags += ['-DCC_AVX2_SUPPORT'] sources_avx2 = files('cnxk_ep_rx_avx.c') endif diff --git a/drivers/net/octeon_ep/otx_ep_ethdev.c b/drivers/net/octeon_ep/otx_ep_ethdev.c index 8b14734b0c..10f2f8a2e0 100644 --- a/drivers/net/octeon_ep/otx_ep_ethdev.c +++ b/drivers/net/octeon_ep/otx_ep_ethdev.c @@ -91,11 +91,9 @@ otx_ep_set_rx_func(struct rte_eth_dev *eth_dev) eth_dev->rx_pkt_burst = &cnxk_ep_recv_pkts; #ifdef RTE_ARCH_X86 eth_dev->rx_pkt_burst = &cnxk_ep_recv_pkts_sse; -#ifdef CC_AVX2_SUPPORT if (rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_256 && rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1) eth_dev->rx_pkt_burst = &cnxk_ep_recv_pkts_avx; -#endif #elif defined(RTE_ARCH_ARM64) eth_dev->rx_pkt_burst = &cnxk_ep_recv_pkts_neon; #endif @@ -105,11 +103,9 @@ otx_ep_set_rx_func(struct rte_eth_dev *eth_dev) eth_dev->rx_pkt_burst = &cn9k_ep_recv_pkts; #ifdef RTE_ARCH_X86 eth_dev->rx_pkt_burst = &cn9k_ep_recv_pkts_sse; -#ifdef CC_AVX2_SUPPORT if (rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_256 && rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1) eth_dev->rx_pkt_burst = &cn9k_ep_recv_pkts_avx; -#endif #elif defined(RTE_ARCH_ARM64) eth_dev->rx_pkt_burst = &cn9k_ep_recv_pkts_neon; #endif -- 2.43.0 ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2025-03-14 17:45 UTC | newest] Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-03-14 17:23 [PATCH 0/3] remove driver-specific logic for AVX builds Bruce Richardson 2025-03-14 17:23 ` [PATCH 1/3] build: add generalized AVX handling for drivers Bruce Richardson 2025-03-14 17:23 ` [PATCH 2/3] net/intel: use common AVX build code Bruce Richardson 2025-03-14 17:23 ` [PATCH 3/3] drivers/net: build use common AVX handling Bruce Richardson 2025-03-14 17:31 ` David Marchand 2025-03-14 17:37 ` Bruce Richardson 2025-03-14 17:44 ` [PATCH v2 0/4] remove driver-specific logic for AVX builds Bruce Richardson 2025-03-14 17:44 ` [PATCH v2 1/4] build: add generalized AVX handling for drivers Bruce Richardson 2025-03-14 17:44 ` [PATCH v2 2/4] net/intel: use common AVX build code Bruce Richardson 2025-03-14 17:44 ` [PATCH v2 3/4] drivers/net: build use common AVX handling Bruce Richardson 2025-03-14 17:44 ` [PATCH v2 4/4] drivers/net: remove AVX2 build-time define Bruce Richardson
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).