diff mbox series

[ovs-dev,v4,7/9] odp-execute: Add ISA implementation of actions.

Message ID 20220105165349.3447695-8-emma.finn@intel.com
State Superseded
Headers show
Series Actions Infrastructure + Optimizations | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test fail github build: failed

Commit Message

Emma Finn Jan. 5, 2022, 4:53 p.m. UTC
This commit adds the AVX512 implementation of the action functionality.

Usage:
  $ ovs-appctl dpif-netdev/action-impl-set avx512

Signed-off-by: Emma Finn <emma.finn@intel.com>
---
 Documentation/topics/dpdk/bridge.rst | 25 ++++++++++
 Documentation/topics/testing.rst     | 20 +++++---
 NEWS                                 |  1 +
 lib/automake.mk                      |  4 +-
 lib/cpu.c                            |  1 +
 lib/cpu.h                            |  1 +
 lib/odp-execute-avx512.c             | 69 ++++++++++++++++++++++++++++
 lib/odp-execute-private.c            |  9 ++++
 lib/odp-execute-private.h            |  9 ++++
 9 files changed, 131 insertions(+), 8 deletions(-)
 create mode 100644 lib/odp-execute-avx512.c

Comments

Van Haaren, Harry Jan. 6, 2022, 1:11 p.m. UTC | #1
> -----Original Message-----
> From: Finn, Emma <emma.finn@intel.com>
> Sent: Wednesday, January 5, 2022 4:54 PM
> To: dev@openvswitch.org; Van Haaren, Harry <harry.van.haaren@intel.com>;
> Amber, Kumar <kumar.amber@intel.com>
> Cc: Finn, Emma <emma.finn@intel.com>
> Subject: [PATCH v4 7/9] odp-execute: Add ISA implementation of actions.
> 
> This commit adds the AVX512 implementation of the action functionality.
> 
> Usage:
>   $ ovs-appctl dpif-netdev/action-impl-set avx512
> 
> Signed-off-by: Emma Finn <emma.finn@intel.com>

Acked-by: Harry van Haaren <harry.van.haaren@intel.com>
diff mbox series

Patch

diff --git a/Documentation/topics/dpdk/bridge.rst b/Documentation/topics/dpdk/bridge.rst
index b79d9871b..8bc85cd0a 100644
--- a/Documentation/topics/dpdk/bridge.rst
+++ b/Documentation/topics/dpdk/bridge.rst
@@ -297,3 +297,28 @@  following command::
 ``scalar`` can be selected on core ``3`` by the following command::
 
     $ ovs-appctl dpif-netdev/miniflow-parser-set -pmd 3 scalar
+
+Actions Performance
+-------------------
+
+Actions are used in OpenFlow flows to describe what to do when the flow
+matches a packet. Just like with the datapath interface, SIMD instructions
+can be applied to the action implementation to improve performance.
+
+OVS provides multiple implementations of the actions.
+Available implementations can be listed with the following command::
+
+    $ ovs-appctl dpif-netdev/action-impl-get
+        Available Actions implementations:
+            scalar (available: True, active: True)
+            autovalidator (available: True, active: False)
+            avx512 (available: True, active: False)
+
+By default, ``scalar`` is used.  Implementations can be selected by
+name::
+
+    $ ovs-appctl dpif-netdev/action-impl-set avx512
+    action implementation set to avx512.
+
+    $ ovs-appctl dpif-netdev/action-impl-set scalar
+    action implementation set to scalar.
diff --git a/Documentation/topics/testing.rst b/Documentation/topics/testing.rst
index c15d5b38f..10d0ecc48 100644
--- a/Documentation/topics/testing.rst
+++ b/Documentation/topics/testing.rst
@@ -361,12 +361,12 @@  testsuite.
 Userspace datapath: Testing and Validation of CPU-specific Optimizations
 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 
-As multiple versions of the datapath classifier and packet parsing functions
-can co-exist, each with different CPU ISA optimizations, it is important to
-validate that they all give the exact same results.  To easily test all the
-implementations, an ``autovalidator`` implementation of them exists.  This
-implementation runs all other available implementations, and verifies that the
-results are identical.
+As multiple versions of the datapath classifier, packet parsing functions and
+actions can co-exist, each with different CPU ISA optimizations, it is
+important to validate that they all give the exact same results.  To easily
+test all the implementations, an ``autovalidator`` implementation of them
+exists. This implementation runs all other available implementations, and
+verifies that the results are identical.
 
 Running the OVS unit tests with the autovalidator enabled ensures all
 implementations provide the same results.  Note that the performance of the
@@ -382,18 +382,24 @@  To set the autovalidator for the packet parser, use this command::
 
     $ ovs-appctl dpif-netdev/miniflow-parser-set autovalidator
 
+To set the autovalidator for actions, use this command::
+
+    $ ovs-appctl dpif-netdev/action-impl-set autovalidator
+
 To run the OVS unit test suite with the autovalidator as the default
 implementation, it is required to recompile OVS.  During the recompilation,
 the default priority of the `autovalidator` implementation is set to the
 maximum priority, ensuring every test will be run with every implementation::
 
-    $ ./configure --enable-autovalidator --enable-mfex-default-autovalidator
+    $ ./configure --enable-autovalidator --enable-mfex-default-autovalidator \
+        --enable-actions-default-autovalidator
 
 The following line should be seen in the configuration log when the above
 options are used::
 
     checking whether DPCLS Autovalidator is default implementation... yes
     checking whether MFEX Autovalidator is default implementation... yes
+    checking whether actions Autovalidator is default implementation... yes
 
 Compile OVS in debug mode to have `ovs_assert` statements error out if
 there is a mis-match in the datapath classifier lookup or packet parser
diff --git a/NEWS b/NEWS
index 2e7dc1acb..f13722ab7 100644
--- a/NEWS
+++ b/NEWS
@@ -20,6 +20,7 @@  Post-v2.16.0
        implementations available at run time.
      * Add build time configure command to enable auto-validator as default
        actions implementation at build time.
+     * Add AVX512 implementation of actions.
    - Python:
      * For SSL support, the use of the pyOpenSSL library has been replaced
        with the native 'ssl' module.
diff --git a/lib/automake.mk b/lib/automake.mk
index 1bc855a6b..e332c3327 100644
--- a/lib/automake.mk
+++ b/lib/automake.mk
@@ -32,6 +32,7 @@  lib_libopenvswitch_la_LIBADD += lib/libopenvswitchavx512.la
 lib_libopenvswitchavx512_la_CFLAGS = \
 	-mavx512f \
 	-mavx512bw \
+	-mavx512vl \
 	-mavx512dq \
 	-mbmi \
 	-mbmi2 \
@@ -42,7 +43,8 @@  lib_libopenvswitchavx512_la_SOURCES = \
 	lib/cpu.h \
 	lib/dpif-netdev-lookup-avx512-gather.c \
 	lib/dpif-netdev-extract-avx512.c \
-	lib/dpif-netdev-avx512.c
+	lib/dpif-netdev-avx512.c \
+	lib/odp-execute-avx512.c
 lib_libopenvswitchavx512_la_LDFLAGS = \
 	-static
 endif
diff --git a/lib/cpu.c b/lib/cpu.c
index 2df003c51..0292f715e 100644
--- a/lib/cpu.c
+++ b/lib/cpu.c
@@ -53,6 +53,7 @@  X86_ISA(X86_EXT_FEATURES_LEAF, EBX, 16, OVS_CPU_ISA_X86_AVX512F)
 X86_ISA(X86_EXT_FEATURES_LEAF, EBX, 30, OVS_CPU_ISA_X86_AVX512BW)
 X86_ISA(X86_EXT_FEATURES_LEAF, ECX,  1, OVS_CPU_ISA_X86_AVX512VBMI)
 X86_ISA(X86_EXT_FEATURES_LEAF, ECX, 14, OVS_CPU_ISA_X86_VPOPCNTDQ)
+X86_ISA(X86_EXT_FEATURES_LEAF, EBX, 31, OVS_CPU_ISA_X86_AVX512VL)
 #endif
 
 bool
diff --git a/lib/cpu.h b/lib/cpu.h
index 92897bb71..3215229bc 100644
--- a/lib/cpu.h
+++ b/lib/cpu.h
@@ -25,6 +25,7 @@  enum ovs_cpu_isa {
     OVS_CPU_ISA_X86_AVX512F,
     OVS_CPU_ISA_X86_AVX512BW,
     OVS_CPU_ISA_X86_AVX512VBMI,
+    OVS_CPU_ISA_X86_AVX512VL,
     OVS_CPU_ISA_X86_VPOPCNTDQ,
     OVS_CPU_ISA_X86_LAST = OVS_CPU_ISA_X86_VPOPCNTDQ,
 };
diff --git a/lib/odp-execute-avx512.c b/lib/odp-execute-avx512.c
new file mode 100644
index 000000000..aa71faa1c
--- /dev/null
+++ b/lib/odp-execute-avx512.c
@@ -0,0 +1,69 @@ 
+/*
+ * Copyright (c) 2021 Intel.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <config.h>
+#include <errno.h>
+
+#include "cpu.h"
+#include "odp-execute-private.h"
+#include "odp-netlink.h"
+#include "dp-packet.h"
+#include "openvswitch/vlog.h"
+
+#include "immintrin.h"
+
+
+/* Probe functions to check ISA requirements. */
+static int32_t
+avx512_isa_probe(uint32_t needs_vbmi)
+{
+    static enum ovs_cpu_isa isa_required[] = {
+        OVS_CPU_ISA_X86_AVX512F,
+        OVS_CPU_ISA_X86_AVX512BW,
+        OVS_CPU_ISA_X86_BMI2,
+        OVS_CPU_ISA_X86_AVX512VL
+    };
+
+    int32_t ret = 0;
+    for (uint32_t i = 0; i < ARRAY_SIZE(isa_required); i++) {
+        if (!cpu_has_isa(isa_required[i])) {
+            ret = -ENOTSUP;
+        }
+    }
+
+    if (needs_vbmi) {
+        if (!cpu_has_isa(OVS_CPU_ISA_X86_AVX512VBMI)) {
+            ret = -ENOTSUP;
+        }
+    }
+
+    return ret;
+}
+
+int32_t
+action_avx512_probe(void)
+{
+    const uint32_t needs_vbmi = 0;
+    return avx512_isa_probe(needs_vbmi);
+}
+
+
+int32_t
+action_avx512_init(void)
+{
+    avx512_isa_probe(0);
+    return 0;
+}
diff --git a/lib/odp-execute-private.c b/lib/odp-execute-private.c
index 2301194a0..19a04f518 100644
--- a/lib/odp-execute-private.c
+++ b/lib/odp-execute-private.c
@@ -46,6 +46,15 @@  static struct odp_execute_action_impl action_impls[] = {
         .probe = NULL,
         .init_func = action_autoval_init,
     },
+
+    #if (__x86_64__ && HAVE_AVX512F && HAVE_LD_AVX512_GOOD && __SSE4_2__)
+    [ACTION_IMPL_AVX512] = {
+        .available = 1,
+        .name = "avx512",
+        .probe = action_avx512_probe,
+        .init_func = NULL,
+    },
+    #endif
 };
 
 static void
diff --git a/lib/odp-execute-private.h b/lib/odp-execute-private.h
index d49714bd2..4c09bee63 100644
--- a/lib/odp-execute-private.h
+++ b/lib/odp-execute-private.h
@@ -73,6 +73,9 @@  enum odp_execute_action_impl_idx {
      * Do not change the autovalidator position in this list without updating
      * the define below.
      */
+    #if (__x86_64__ && HAVE_AVX512F && HAVE_LD_AVX512_GOOD && __SSE4_2__)
+    ACTION_IMPL_AVX512,
+    #endif
 
     ACTION_IMPL_MAX,
 };
@@ -98,4 +101,10 @@  int32_t odp_execute_action_set(const char *name,
  */
 int32_t odp_action_scalar_init(struct odp_execute_action_impl *self);
 
+/* Init function for the optimized with AVX512 actions. */
+int32_t action_avx512_init(void);
+
+/* Probe function to check ISA requirements. */
+int32_t action_avx512_probe(void);
+
 #endif /* ODP_EXTRACT_PRIVATE */