[dpdk-dev] [EXT] [PATCH v6 17/18] node: choose vector path at runtime
Nithin Dabilpuram
ndabilpuram at marvell.com
Thu Oct 15 13:18:52 CEST 2020
On Thu, Oct 15, 2020 at 11:38:13AM +0100, Ciara Power wrote:
> External Email
>
> ----------------------------------------------------------------------
> When choosing the vector path, max SIMD bitwidth is now checked to
> ensure the vector path is suitable. To do this, the scalar function is
> chosen by default in the struct, but at node initialisation time, this
> function pointer is updated to the vector version if supported, and
> if it is within the max SIMD bitwidth limit.
>
> 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>
>
> ---
> v6:
> - Removed generic process function.
> - Change the process function pointer at node init time to vector
> function if suitable.
> ---
Acked-by: Nithin Dabilpuram <ndabilpuram at marvell.com>
> lib/librte_node/ip4_lookup.c | 14 +++++++++-----
> lib/librte_node/ip4_lookup_neon.h | 2 +-
> lib/librte_node/ip4_lookup_sse.h | 2 +-
> 3 files changed, 11 insertions(+), 7 deletions(-)
>
> diff --git a/lib/librte_node/ip4_lookup.c b/lib/librte_node/ip4_lookup.c
> index 293c77f39e..934a6d7eab 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,8 +109,6 @@ ip4_lookup_node_process(struct rte_graph *graph, struct rte_node *node,
> return nb_objs;
> }
>
> -#endif
> -
> int
> rte_node_ip4_route_add(uint32_t ip, uint8_t depth, uint16_t next_hop,
> enum rte_node_ip4_lookup_next next_node)
> @@ -194,13 +192,19 @@ ip4_lookup_node_init(const struct rte_graph *graph, struct rte_node *node)
> init_once = 1;
> }
> *lpm_p = ip4_lookup_nm.lpm_tbl[graph->socket];
> +
> +#if defined(__ARM_NEON) || defined(RTE_ARCH_X86)
> + if (rte_get_max_simd_bitwidth() >= RTE_SIMD_128)
> + node->process = ip4_lookup_node_process_vec;
> +#endif
> +
> node_dbg("ip4_lookup", "Initialized ip4_lookup node");
>
> return 0;
> }
>
> static struct rte_node_register ip4_lookup_node = {
> - .process = ip4_lookup_node_process,
> + .process = ip4_lookup_node_process_scalar,
> .name = "ip4_lookup",
>
> .init = ip4_lookup_node_init,
> 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