Ошибка при запуске приложения DPDK на valgrind

Когда я запускаю свое приложение на основе DPDK на valgrind, оно не может его выполнить и выдает ошибку

ОШИБКА: Эта система не поддерживает "RDRAND". Убедитесь, что RTE_MACHINE установлен правильно.

Мой процессор поддерживает RDRAND, но выдает ту же ошибку. Чтобы valgrind поддерживал огромные страницы, используемые моим приложением, я использую следующую исправленную версию valgrind. https://github.com/bisdn/valgrind-hugepages.git


person Vineet    schedule 23.05.2016    source источник
comment
Есть такая же проблема. Исправленная версия valgrind хорошо работала со старыми версиями DPDK.   -  person Zhandos Zhylkaidar    schedule 27.06.2016


Ответы (3)


У меня была такая же проблема на процессоре с архитектурой Haswell, и я смог исправить ее, изменив один из make-файлов, чтобы удалить несколько параметров. В частности, 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
person Tim    schedule 24.08.2016

RDRAND был представлен на IvyBridge, вы можете собрать dpdk с определенным подмножеством инструкций, используя «CONFIG_RTE_MACHINE». В этом случае вы можете использовать SandyBridge в качестве машины.

Измените $RTE_SDK/$RTE_TARGET/.config, установите CONFIG_RTE_MACHINE="snb" и перестройте библиотеку DPDK (сделайте -C $RTE_SDK/$RTE_TARGET).

person Eric    schedule 02.09.2016

Я нашел другое решение этой проблемы. DPDK поддерживает переменную EXTRA_CFLAGS, которую вы можете использовать для указания собственных флагов для GCC. Начальный make-файл запускает gcc с параметрами -dN -E, чтобы проверить, что поддерживается платформой. Если вы хотите отключить некоторые наборы инструкций, например. RDRAND, вы можете указать опцию

export EXTRA_CFLAGS=-mno-rdrnd

и это отключит RDRAND во встроенных двоичных файлах библиотеки DPDK.

person Gregory Shimansky    schedule 06.02.2018