运行 DPDK 应用程序在 valgrind 上出错
Error when running DPDK app on valgrind
当我 运行 我的基于 DPDK 的应用程序在 valgrind 上时,它无法执行并抛出错误
ERROR: This system does not support "RDRAND". Please check that
RTE_MACHINE is set correctly.
我的 CPU 支持 RDRAND,但它仍然抛出相同的错误。为了让 valgrind 支持我的应用程序正在使用的大页面,我使用了以下修补版本的 valgrind。
https://github.com/bisdn/valgrind-hugepages.git
我在 Haswell 架构上遇到了同样的问题 CPU,并且能够通过修改其中一个 makefile 以删除一些选项来修复它。具体来说,AVX/AVX2、RDRND、FSGSBASE 和 F16C。您可能需要删除 valgrind 犹豫不决的其他选项并重新编译 DPDK,这对我来说是一个迭代过程。使用 .config 文件可能有更优雅的方法来执行此操作,但我没有找到它。查看此补丁:
diff -u dpdk-2.2.0-orig/mk/rte.cpuflags.mk dpdk-2.2.0/mk/rte.cpuflags.mk
--- dpdk-2.2.0-orig/mk/rte.cpuflags.mk^I2015-12-15 12:06:58.000000000 -0500
+++ dpdk-2.2.0/mk/rte.cpuflags.mk^I2016-08-24 08:53:22.911258783 -0400
@@ -69,26 +69,6 @@
CPUFLAGS += PCLMULQDQ
endif
-ifneq ($(filter $(AUTO_CPUFLAGS),__AVX__),)
-CPUFLAGS += AVX
-endif
-
-ifneq ($(filter $(AUTO_CPUFLAGS),__RDRND__),)
-CPUFLAGS += RDRAND
-endif
-
-ifneq ($(filter $(AUTO_CPUFLAGS),__FSGSBASE__),)
-CPUFLAGS += FSGSBASE
-endif
-
-ifneq ($(filter $(AUTO_CPUFLAGS),__F16C__),)
-CPUFLAGS += F16C
-endif
-
-ifneq ($(filter $(AUTO_CPUFLAGS),__AVX2__),)
-CPUFLAGS += AVX2
-endif
-
# IBM Power CPU flags
ifneq ($(filter $(AUTO_CPUFLAGS),__PPC64__),)
CPUFLAGS += PPC64
RDRAND 是在 IvyBridge 上引入的,您可以使用 "CONFIG_RTE_MACHINE" 使用特定的指令子集构建 dpdk。对于这种情况,您可以使用 SandyBridge 作为机器。
修改$RTE_SDK/$RTE_TARGET/.config,设置CONFIG_RTE_MACHINE="snb",重建DPDK库(make -C $RTE_SDK/$RTE_TARGET).
我找到了解决这个问题的另一种方法。 DPDK 支持 EXTRA_CFLAGS
变量,你可以使用它来为 GCC 指定你自己的标志。初始 makefile 使用选项 -dN -E
运行 gcc 以检查平台支持的内容。如果您想禁用某些指令集,例如RDRAND,你可以指定选项
export EXTRA_CFLAGS=-mno-rdrnd
这将在内置的 DPDK 库二进制文件中禁用 RDRAND。
当我 运行 我的基于 DPDK 的应用程序在 valgrind 上时,它无法执行并抛出错误
ERROR: This system does not support "RDRAND". Please check that RTE_MACHINE is set correctly.
我的 CPU 支持 RDRAND,但它仍然抛出相同的错误。为了让 valgrind 支持我的应用程序正在使用的大页面,我使用了以下修补版本的 valgrind。 https://github.com/bisdn/valgrind-hugepages.git
我在 Haswell 架构上遇到了同样的问题 CPU,并且能够通过修改其中一个 makefile 以删除一些选项来修复它。具体来说,AVX/AVX2、RDRND、FSGSBASE 和 F16C。您可能需要删除 valgrind 犹豫不决的其他选项并重新编译 DPDK,这对我来说是一个迭代过程。使用 .config 文件可能有更优雅的方法来执行此操作,但我没有找到它。查看此补丁:
diff -u dpdk-2.2.0-orig/mk/rte.cpuflags.mk dpdk-2.2.0/mk/rte.cpuflags.mk
--- dpdk-2.2.0-orig/mk/rte.cpuflags.mk^I2015-12-15 12:06:58.000000000 -0500
+++ dpdk-2.2.0/mk/rte.cpuflags.mk^I2016-08-24 08:53:22.911258783 -0400
@@ -69,26 +69,6 @@
CPUFLAGS += PCLMULQDQ
endif
-ifneq ($(filter $(AUTO_CPUFLAGS),__AVX__),)
-CPUFLAGS += AVX
-endif
-
-ifneq ($(filter $(AUTO_CPUFLAGS),__RDRND__),)
-CPUFLAGS += RDRAND
-endif
-
-ifneq ($(filter $(AUTO_CPUFLAGS),__FSGSBASE__),)
-CPUFLAGS += FSGSBASE
-endif
-
-ifneq ($(filter $(AUTO_CPUFLAGS),__F16C__),)
-CPUFLAGS += F16C
-endif
-
-ifneq ($(filter $(AUTO_CPUFLAGS),__AVX2__),)
-CPUFLAGS += AVX2
-endif
-
# IBM Power CPU flags
ifneq ($(filter $(AUTO_CPUFLAGS),__PPC64__),)
CPUFLAGS += PPC64
RDRAND 是在 IvyBridge 上引入的,您可以使用 "CONFIG_RTE_MACHINE" 使用特定的指令子集构建 dpdk。对于这种情况,您可以使用 SandyBridge 作为机器。
修改$RTE_SDK/$RTE_TARGET/.config,设置CONFIG_RTE_MACHINE="snb",重建DPDK库(make -C $RTE_SDK/$RTE_TARGET).
我找到了解决这个问题的另一种方法。 DPDK 支持 EXTRA_CFLAGS
变量,你可以使用它来为 GCC 指定你自己的标志。初始 makefile 使用选项 -dN -E
运行 gcc 以检查平台支持的内容。如果您想禁用某些指令集,例如RDRAND,你可以指定选项
export EXTRA_CFLAGS=-mno-rdrnd
这将在内置的 DPDK 库二进制文件中禁用 RDRAND。