几句话说清楚7:DPDK不同CPU平台交叉编译指令不支持的问题

现象

在比较高级的CPU平台(比如skylake)编译DPDK,会在编译的目标文件中加入一些高级指令集中的指令,比如AVX512。

如果运行最终可执行文件的机器的CPU架构(比如broadwell)不支持编译机器中的指令,则会在执行时报类似这种错误:

1
174146:Dec 21 10:56:30 n10-023-013 kernel: [57619.700220] traps: obj-name[861199] trap invalid opcode ip:501c31 sp:7fff9782d090 error:0

其实就是在0x501c31(ip是instruction pointer)这个位置上的指令不支持(invalid)。

原因

那么如何查看具体是哪条指令呢?

objdump -D obj-name查看一下目标文件的汇编代码,找到该位置上的指令。

我这里的例子中,这个指令是vmovdqa64,简单搜索一下可以知道这是个AVX512f的指令。

其他详细内容可以查看Intel SDM(Software Development Manual)下载链接

而这个指令在skylake上支持,broadwell上不支持。

可以通过在两个机器上执行cat /proc/cpuinfo | grep flags查看支持的指令集。或者执行gcc -march=native -Q --help=target查看。

方法

在编译机器(skylake)DPDK的/mk/machine/native/rte.vars.mk中,设置MACHINE_CFLAGS= -march=native-march=broadwell就可以了。

当然还有一些详细的交叉编译方法,可以参考这篇文章

另外还有一点要提醒的是,如果你是在编译某些基于DPDK的应用,比如DPVS,要一并修改应用中的编译配置,例如DPVS就是在./src/dpdk.mk中,需要修改CFLAGS += -march=broadwell

,
© 2020 DecodeZ All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero