node: choose vector path at runtime
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. Signed-off-by: Ciara Power <ciara.power@intel.com> Acked-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
This commit is contained in:
parent
209fd1984a
commit
13facf47d6
@ -15,6 +15,7 @@
|
||||
#include <rte_mbuf.h>
|
||||
#include <rte_tcp.h>
|
||||
#include <rte_udp.h>
|
||||
#include <rte_vect.h>
|
||||
|
||||
#include "rte_node_ip4_api.h"
|
||||
|
||||
@ -34,10 +35,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 +110,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 +193,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_vect_get_max_simd_bitwidth() >= RTE_VECT_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,
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user