[dpdk-dev] [PATCH v5 17/17] node: choose vector path at runtime
Ananyev, Konstantin
konstantin.ananyev at intel.com
Tue Oct 13 15:42:12 CEST 2020
> When choosing the vector path, max SIMD bitwidth is now checked to
> ensure the vector path is suitable. To do this, rather than the
> scalar/vector lookup functions being called directly from the apps, a
> generic function is called which will then call the scalar or vector
> lookup function.
>
> Cc: Nithin Dabilpuram <ndabilpuram at marvell.com>
> Cc: Pavan Nikhilesh <pbhagavatula at marvell.com>
> Cc: Jerin Jacob <jerinj at marvell.com>
> Cc: Kiran Kumar K <kirankumark at marvell.com>
>
> Signed-off-by: Ciara Power <ciara.power at intel.com>
> ---
> lib/librte_node/ip4_lookup.c | 13 +++++++++++--
> lib/librte_node/ip4_lookup_neon.h | 2 +-
> lib/librte_node/ip4_lookup_sse.h | 2 +-
> 3 files changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/lib/librte_node/ip4_lookup.c b/lib/librte_node/ip4_lookup.c
> index 293c77f39e..b3edbc1f4d 100644
> --- a/lib/librte_node/ip4_lookup.c
> +++ b/lib/librte_node/ip4_lookup.c
> @@ -34,10 +34,10 @@ static struct ip4_lookup_node_main ip4_lookup_nm;
> #include "ip4_lookup_neon.h"
> #elif defined(RTE_ARCH_X86)
> #include "ip4_lookup_sse.h"
> -#else
> +#endif
>
> static uint16_t
> -ip4_lookup_node_process(struct rte_graph *graph, struct rte_node *node,
> +ip4_lookup_node_process_scalar(struct rte_graph *graph, struct rte_node *node,
> void **objs, uint16_t nb_objs)
> {
> struct rte_ipv4_hdr *ipv4_hdr;
> @@ -109,7 +109,16 @@ ip4_lookup_node_process(struct rte_graph *graph, struct rte_node *node,
> return nb_objs;
> }
>
> +static uint16_t
> +ip4_lookup_node_process(struct rte_graph *graph, struct rte_node *node,
> + void **objs, uint16_t nb_objs)
> +{
> +#if defined(RTE_MACHINE_CPUFLAG_NEON) || defined(RTE_ARCH_X86)
> + if (rte_get_max_simd_bitwidth() >= RTE_SIMD_128)
> + return ip4_lookup_node_process_vec(graph, node, objs, nb_objs);
> #endif
> + return ip4_lookup_node_process_scalar(graph, node, objs, nb_objs);
> +}
Just wonder can't this selection be done once at ip4_lookup_node_init()?
>
> int
> rte_node_ip4_route_add(uint32_t ip, uint8_t depth, uint16_t next_hop,
> diff --git a/lib/librte_node/ip4_lookup_neon.h b/lib/librte_node/ip4_lookup_neon.h
> index 5e5a7d87be..0ad2763b82 100644
> --- a/lib/librte_node/ip4_lookup_neon.h
> +++ b/lib/librte_node/ip4_lookup_neon.h
> @@ -7,7 +7,7 @@
>
> /* ARM64 NEON */
> static uint16_t
> -ip4_lookup_node_process(struct rte_graph *graph, struct rte_node *node,
> +ip4_lookup_node_process_vec(struct rte_graph *graph, struct rte_node *node,
> void **objs, uint16_t nb_objs)
> {
> struct rte_mbuf *mbuf0, *mbuf1, *mbuf2, *mbuf3, **pkts;
> diff --git a/lib/librte_node/ip4_lookup_sse.h b/lib/librte_node/ip4_lookup_sse.h
> index a071cc5919..264c986071 100644
> --- a/lib/librte_node/ip4_lookup_sse.h
> +++ b/lib/librte_node/ip4_lookup_sse.h
> @@ -7,7 +7,7 @@
>
> /* X86 SSE */
> static uint16_t
> -ip4_lookup_node_process(struct rte_graph *graph, struct rte_node *node,
> +ip4_lookup_node_process_vec(struct rte_graph *graph, struct rte_node *node,
> void **objs, uint16_t nb_objs)
> {
> struct rte_mbuf *mbuf0, *mbuf1, *mbuf2, *mbuf3, **pkts;
> --
> 2.22.0
More information about the dev
mailing list