DPDK2.2.0开发杂记二—— 关于系统兼容性编译选项

        由于DPDK追求提高性能,在编译层面默认打开了许多优化选项,默认根据编译环境CPU所支持的指令集进行优化。但是当部署的时候,一旦编译环境与部署环境硬件层面不一致,可能部署环境CPU不支持某些指令集,这样就会导致应用进程无法在部署环境上正常启动。当部署的服务器很多,我们无法保证所有硬件都是完全一致的情况下,我们就需要关闭一些优化选项牺牲一些性能使之能成功部署。然而DPDK编译逻辑复杂,编译脚本繁多,以下就是我在开发验证过程中总结的一些修改过的编译选项及所在脚本文件。

(1) 文件dpdk-2.2.0\mk\machine\native\rte.vars.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 is

DPDK默认参数是-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 SSSE3

instruction set support.

(2) 文件dpdk-2.2.0\mk\toolchain\gcc\rte.toolchain-compat.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指令集。

(2) 文件dpdk-2.2.0\mk\rte.cpuflags.mk

--- 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指令集。


请参考GCC Documentation


版权声明:本文为博主原创文章,承蒙转载请注明作者和出处https://blog.csdn.net/zangchang/article/details/80084257


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值