@@ -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.
@@ -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
@@ -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.
@@ -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
@@ -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
@@ -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,
};
new file mode 100644
@@ -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;
+}
@@ -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
@@ -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 */
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