由于DPDK追求提高性能,在编译层面默认打开了许多优化选项,默认根据编译环境CPU所支持的指令集进行优化。但是当部署的时候,一旦编译环境与部署环境硬件层面不一致,可能部署环境CPU不支持某些指令集,这样就会导致应用进程无法在部署环境上正常启动。当部署的服务器很多,我们无法保证所有硬件都是完全一致的情况下,我们就需要关闭一些优化选项牺牲一些性能使之能成功部署。然而DPDK编译逻辑复杂,编译脚本繁多,以下就是我在开发验证过程中总结的一些修改过的编译选项及所在脚本文件。
(1) 文件dpdk-2.2.0\mk\machine\native\rte.vars.mk
(2) 文件dpdk-2.2.0\mk\toolchain\gcc\rte.toolchain-compat.mk--- cmp2/machine/native/rte.vars.mk 2015-12-16 01:06:58.000000000 +0800
+++ cmp1/machine/native/rte.vars.mk 2017-06-14 14:35:09.000000000 +0800
@@ -55,7 +55,7 @@
# CPU_LDFLAGS =
# CPU_ASFLAGS =
-MACHINE_CFLAGS = -march=native
+MACHINE_CFLAGS = -march=core2
# On FreeBSD systems, sometimes the correct CPU type is not picked up.
# To get everything to compile, we need SSE4.2 support, so check if that isDPDK默认参数是-march=native,表示根据编译环境硬件配置所支持的指令集进行编译优化。以下是其GCC文档里面的英文解释。
native
This selects the CPU to generate code for at compilation time by determining the
processor type of the compiling machine. Using ‐march=native enables all
instruction subsets supported by the local machine (hence the result might not run
on different machines). Using ‐mtune=native produces code optimized for the local
machine under the constraints of the selected instruction set.我们一般修改为core2,使用固定指令集。
core2
Intel Core 2 CPU with 64‐bit extensions, MMX, SSE, SSE2, SSE3 and SSSE3instruction set support.
(2) 文件dpdk-2.2.0\mk\rte.cpuflags.mk--- cmp2/toolchain/gcc/rte.toolchain-compat.mk 2015-12-16 01:06:58.000000000 +0800
+++ cmp1/toolchain/gcc/rte.toolchain-compat.mk 2017-06-14 14:35:09.000000000 +0800
@@ -70,7 +70,7 @@
ifeq ($(shell test $(GCC_VERSION) -lt 45 && echo 1), 1)
MACHINE_CFLAGS := $(patsubst -march=atom,-march=core2 -mssse3,$(MACHINE_CFLAGS))
endif
- ifeq ($(shell test $(GCC_VERSION) -lt 44 && echo 1), 1)
+# ifeq ($(shell test $(GCC_VERSION) -lt 44 && echo 1), 1)
MACHINE_CFLAGS := $(filter-out -mavx -mpclmul -maes,$(MACHINE_CFLAGS))
ifneq ($(findstring SSE4_2, $(CPUFLAGS)),)
MACHINE_CFLAGS += -msse4.2
@@ -78,7 +78,7 @@
ifneq ($(findstring SSE4_1, $(CPUFLAGS)),)
MACHINE_CFLAGS += -msse4.1
endif
- endif
+# endif
ifeq ($(shell test $(GCC_VERSION) -lt 43 && echo 1), 1)
MACHINE_CFLAGS := $(filter-out -msse% -mssse%,$(MACHINE_CFLAGS))
MACHINE_CFLAGS := $(patsubst -march=core2,-march=generic,$(MACHINE_CFLAGS))
@@ -87,4 +87,11 @@
ifeq ($(shell test $(GCC_VERSION) -lt 42 && echo 1), 1)
MACHINE_CFLAGS := $(filter-out -march% -mtune% -msse%,$(MACHINE_CFLAGS))
endif
+
+ MACHINE_CFLAGS := $(filter-out -mavx -mpclmul -maes,$(MACHINE_CFLAGS))
+ MACHINE_CFLAGS := $(filter-out -mavx,$(MACHINE_CFLAGS))
+ MACHINE_CFLAGS := $(filter-out -mpclmul,$(MACHINE_CFLAGS))
+ MACHINE_CFLAGS := $(filter-out -maes,$(MACHINE_CFLAGS))
+
+ MACHINE_CFLAGS += -mno-avx -mno-pclmul -mno-aes
endif禁用AVX、PCLMUL、AES指令集。
--- cmp2/rte.cpuflags.mk 2015-12-16 01:06:58.000000000 +0800
+++ cmp1/rte.cpuflags.mk 2017-06-14 14:35:09.000000000 +0800
@@ -61,17 +61,17 @@
CPUFLAGS += SSE4_2
endif
-ifneq ($(filter $(AUTO_CPUFLAGS),__AES__),)
-CPUFLAGS += AES
-endif
-
-ifneq ($(filter $(AUTO_CPUFLAGS),__PCLMUL__),)
-CPUFLAGS += PCLMULQDQ
-endif
-
-ifneq ($(filter $(AUTO_CPUFLAGS),__AVX__),)
-CPUFLAGS += AVX
-endif
+# ifneq ($(filter $(AUTO_CPUFLAGS),__AES__),)
+# CPUFLAGS += AES
+# endif
+
+# ifneq ($(filter $(AUTO_CPUFLAGS),__PCLMUL__),)
+# CPUFLAGS += PCLMULQDQ
+# endif
+
+# ifneq ($(filter $(AUTO_CPUFLAGS),__AVX__),)
+# CPUFLAGS += AVX
+# endif
ifneq ($(filter $(AUTO_CPUFLAGS),__RDRND__),)
CPUFLAGS += RDRAND禁用AVX、PCLMUL、AES指令集。
版权声明:本文为博主原创文章,承蒙转载请注明作者和出处https://blog.csdn.net/zangchang/article/details/80084257