1

当我在 valgrind 上运行基于 DPDK 的应用程序时,它无法执行并引发错误

错误:此系统不支持“RDRAND”。请检查 RTE_MACHINE 是否设置正确。

我的 CPU 支持 RDRAND,但它仍然抛出相同的错误。为了让 valgrind 支持我的应用程序正在使用的大页面,我使用了以下 valgrind 的修补版本。 https://github.com/bisdn/valgrind-hugepages.git

4

3 回答 3

5

我在 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
于 2016-08-24T14:05:55.937 回答
3

RDRAND 是在 IvyBridge 上引入的,您可以使用“CONFIG_RTE_MACHINE”使用特定的指令子集构建 dpdk。对于这种情况,您可以使用 SandyBridge 作为机器。

修改$RTE_SDK/$RTE_TARGET/.config,设置CONFIG_RTE_MACHINE="snb",重建DPDK库(make -C $RTE_SDK/$RTE_TARGET)。

于 2016-09-02T20:43:10.983 回答
1

我找到了解决这个问题的另一种方法。DPDK 支持EXTRA_CFLAGS变量,您可以使用该变量为 GCC 指定您自己的标志。初始 makefile 运行 gcc 并带有选项-dN -E以检查平台支持的内容。如果你想禁用一些指令集,例如 RDRAND,你可以指定选项

export EXTRA_CFLAGS=-mno-rdrnd

这将禁用内置 DPDK 库二进制文件中的 RDRAND。

于 2018-02-06T18:04:33.050 回答