[dpdk-dev] [PATCH v7 06/17] lib: add SIMD flow matching to distributor
Bruce Richardson
bruce.richardson at intel.com
Fri Feb 24 15:11:53 CET 2017
On Tue, Feb 21, 2017 at 03:17:42AM +0000, David Hunt wrote:
> Add an optimised version of the in-flight flow matching algorithm
> using SIMD instructions. This should give up to 1.5x over the scalar
> versions performance.
>
> Falls back to scalar version if SSE4.2 not available
>
> Signed-off-by: David Hunt <david.hunt at intel.com>
> ---
> lib/librte_distributor/Makefile | 7 ++
> lib/librte_distributor/rte_distributor.c | 16 ++-
> .../rte_distributor_match_generic.c | 43 ++++++++
> lib/librte_distributor/rte_distributor_match_sse.c | 113 +++++++++++++++++++++
> lib/librte_distributor/rte_distributor_private.h | 5 +
> 5 files changed, 182 insertions(+), 2 deletions(-)
> create mode 100644 lib/librte_distributor/rte_distributor_match_generic.c
> create mode 100644 lib/librte_distributor/rte_distributor_match_sse.c
>
> diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
> index 276695a..5b599c6 100644
> --- a/lib/librte_distributor/Makefile
> +++ b/lib/librte_distributor/Makefile
> @@ -44,6 +44,13 @@ LIBABIVER := 1
> # all source are stored in SRCS-y
> SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor_v20.c
> SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += rte_distributor.c
> +ifeq ($(CONFIG_RTE_ARCH_X86),y)
> +SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += rte_distributor_match_sse.c
> +CFLAGS_rte_distributor_match_sse.o += -msse4.2
> +else
> +SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += rte_distributor_match_generic.c
> +endif
> +
>
> # install this header file
> SYMLINK-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR)-include := rte_distributor_v20.h
> diff --git a/lib/librte_distributor/rte_distributor.c b/lib/librte_distributor/rte_distributor.c
> index ae8d508..b8e171c 100644
> --- a/lib/librte_distributor/rte_distributor.c
> +++ b/lib/librte_distributor/rte_distributor.c
> @@ -392,7 +392,13 @@ rte_distributor_process(struct rte_distributor *d,
> for (; i < RTE_DIST_BURST_SIZE; i++)
> flows[i] = 0;
>
> - find_match_scalar(d, &flows[0], &matches[0]);
> + switch (d->dist_match_fn) {
> + case RTE_DIST_MATCH_VECTOR:
> + find_match_vec(d, &flows[0], &matches[0]);
> + break;
> + default:
> + find_match_scalar(d, &flows[0], &matches[0]);
> + }
>
> /*
> * Matches array now contain the intended worker ID (+1) of
> @@ -608,7 +614,13 @@ rte_distributor_create(const char *name,
> snprintf(d->name, sizeof(d->name), "%s", name);
> d->num_workers = num_workers;
> d->alg_type = alg_type;
> - d->dist_match_fn = RTE_DIST_MATCH_SCALAR;
> +
> +#if defined(RTE_ARCH_X86)
> + if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_SSE4_2)) {
> + d->dist_match_fn = RTE_DIST_MATCH_VECTOR;
> + } else
Minor nit: you can remove the braces here.
/Bruce
More information about the dev
mailing list