[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