DPDK 21.11编译指定cascadelake时VM误检测AVX512致崩溃
关于DPDK 21.11编译误检测AVX512指令集的问题
我使用以下命令编译DPDK 21.11:
因服务器型号不同,必须指定-Dcpu_instruction_set参数。
编译命令:
meson -Dcpu_instruction_set=cascadelake -Dprefix=/ build
但在部分虚拟机(VM)中,尽管实际硬件不支持AVX512指令集,编译时仍会选中AVX512;不指定该参数时编译正常。目前用该参数编译后的应用会崩溃,请问误检测AVX512标志的原因是什么?
相关检测信息
编译阶段指令集检测输出
Checking if "AVX512 checking" compiles: YES Fetching value of define "__SSE4_2__" : 1 Fetching value of define "__AES__" : 1 Fetching value of define "__AVX__" : 1 Fetching value of define "__AVX2__" : 1 Fetching value of define "__AVX512BW__" : 1 Fetching value of define "__AVX512CD__" : 1 Fetching value of define "__AVX512DQ__" : 1 Fetching value of define "__AVX512F__" : 1 Fetching value of define "__AVX512VL__" : 1 Fetching value of define "__PCLMUL__" : 1 Fetching value of define "__RDRND__" : 1 Fetching value of define "__RDSEED__" : 1 Fetching value of define "__VPCLMULQDQ__" :
CPUID实际指令集检测结果
cpuid | grep AVX512 AVX512F: AVX-512 foundation instructions = false AVX512DQ: double & quadword instructions = false AVX512IFMA: fused multiply add = false AVX512PF: prefetch instructions = false AVX512ER: exponent & reciprocal instrs = false AVX512CD: conflict detection instrs = false AVX512BW: byte & word instructions = false AVX512VL: vector length = false AVX512VBMI: vector byte manipulation = false AVX512_VBMI2: byte VPCOMPRESS, VPEXPAND = false AVX512_VNNI: neural network instructions = false AVX512_BITALG: bit count/shiffle = false AVX512: VPOPCNTDQ instruction = false AVX512_4VNNIW: neural network instrs = false AVX512_4FMAPS: multiply acc single prec = false AVX512_VP2INTERSECT: intersect mask regs = false # 后续重复检测结果均为false,此处省略
系统CPU信息
Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 12 On-line CPU(s) list: 0-11 Thread(s) per core: 1 Core(s) per socket: 2 Socket(s): 6 NUMA node(s): 6 Vendor ID: GenuineIntel BIOS Vendor ID: GenuineIntel CPU family: 6 Model: 45 Model name: Intel(R) Xeon(R) Platinum 8253 CPU @ 2.20GHz BIOS Model name: Intel(R) Xeon(R) Platinum 8253 CPU @ 2.20GHz Stepping: 2 CPU MHz: 2194.843 BogoMIPS: 4389.68 Hypervisor vendor: VMware Virtualization type: full L1d cache: 32K L1i cache: 32K L2 cache: 1024K L3 cache: 22528K NUMA node0 CPU(s): 0,1 NUMA node1 CPU(s): 2,3 NUMA node2 CPU(s): 4,5 NUMA node3 CPU(s): 6,7 NUMA node4 CPU(s): 8,9 NUMA node5 CPU(s): 10,11 Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx hypervisor lahf_lm pti arat
原因分析
cpu_instruction_set参数的硬性指定逻辑:当手动指定该参数为cascadelake时,DPDK会直接套用Cascade Lake架构预设的全量指令集特性,跳过对当前硬件的实时指令集检测。而Cascade Lake原生支持AVX512,因此编译系统会强制启用所有AVX512相关编译宏。- 虚拟机CPU标识与实际指令集的 mismatch:虚拟机的CPU型号显示为Cascade Lake系列的Xeon Platinum 8253,但虚拟化层实际屏蔽了AVX512指令集。此时指定
cascadelake参数会让DPDK误判硬件支持AVX512,编译出包含该指令集的代码,而虚拟机无法执行这些指令,最终导致应用崩溃。 - 无参数时的自动适配逻辑:不指定
cpu_instruction_set时,DPDK会通过CPUID指令实时检测当前硬件的实际指令集支持情况,能正确识别到AVX512未被启用,因此编译出的代码仅包含虚拟机真实支持的指令集,运行正常。
内容的提问来源于stack exchange,提问作者nmurshed
相关产品推荐
相关产品推荐

