Ubuntu 22.04与OpenMPI识别12代Intel CPU全E/P核的方案咨询
我在搭载12代Intel Core i7-12800HX CPU(8个P核+8个E核,共支持24线程,每个P核2线程、每个E核1线程)的笔记本上运行Ubuntu 22.04系统。Ubuntu能正确识别CPU型号,但仅识别到12个核心与24线程。使用OpenMPI运行并行任务时,若尝试使用超过12个核心会报错,同时发现部分进程运行速度远快于其他进程,推测是P核与E核的性能差异导致。
请问有何方法能让Ubuntu与OpenMPI识别所有核心,且区分P核与E核?
更新信息
mpirun --display-map -n 1 true 输出
Data for JOB [3978,1] offset 0 Total slots allocated 12 ======================== JOB MAP ======================== Data for node: xxxxxxxx Num slots: 12 Max slots: 0 Num procs: 1 Process OMPI jobid: [3978,1] App: 0 Process rank: 0 Bound: socket 0[core 0[hwt 0-1]]:[BB/../../../../../../../../../../..] =============================================================
lscpu 输出
架构:x86_64
CPU运行模式:32位、64位
地址大小:物理39位,虚拟48位
字节序:小端序
CPU总数:24
在线CPU列表:0-23
厂商ID:GenuineIntel
型号名称:12th Gen Intel(R) Core(TM) i7-12800HX
CPU系列:6
型号:151
每核心线程数:2
每插槽核心数:12
插槽数:1
步进:2
BogoMIPS:4608.01
标志:fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves avx_vnni umip waitpkg gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm serialize flush_l1d arch_capabilities
虚拟化特性:
虚拟化:VT-x
虚拟机监控程序厂商:Microsoft
虚拟化类型:完全虚拟化
缓存(总计):
L1d:576 KiB(12个实例)
L1i:384 KiB(12个实例)
L2:15 MiB(12个实例)
L3:25 MiB(1个实例)
漏洞:
Itlb multihit:不受影响
L1tf:不受影响
Mds:不受影响
Meltdown:不受影响
Mmio stale data:不受影响
Retbleed:缓解措施;增强型IBRS
Spec store bypass:缓解措施;通过prctl和seccomp禁用推测性存储绕过
Spectre v1:缓解措施;usercopy/swapgs屏障及__user指针 sanitization
Spectre v2:缓解措施;增强型IBRS,条件性IBPB,RSB填充,PBRSB-eIBRS软件序列
Srbds:不受影响
Tsx async abort:不受影响
1. 让Ubuntu识别P/E核结构
从lscpu输出看,系统已识别24个CPU线程,但默认将P核的2线程、E核的1线程统一统计为逻辑核心,合计12个。要区分P/E核,可借助Intel官方工具:
- 安装
intel-cmt-cat工具包:sudo apt install intel-cmt-cat - 运行
pqos --info查看核心分组,P核通常标记为Core Type: 0,E核标记为Core Type: 1。
2. 配置OpenMPI适配异构核心
OpenMPI默认基于逻辑核心计数,因此只识别到12个可用slot。可通过以下方式调整:
方法一:手动指定进程数并允许超线程绑定
直接指定24个进程,同时允许在P核上绑定多个线程:
mpirun -np 24 --bind-to core:overload-allowed 你的MPI程序
--bind-to core:overload-allowed适配P核的超线程特性,允许同一物理核心绑定多个进程。
方法二:依赖hwloc自动识别拓扑
OpenMPI依赖hwloc获取CPU拓扑,确保工具包版本适配12代酷睿:
sudo apt install hwloc libhwloc-dev
运行任务时让OpenMPI自动检测拓扑并绑定:
mpirun -np 24 --report-bindings 你的MPI程序
--report-bindings会输出每个进程绑定的核心编号,可直观区分P核与E核上的进程。
方法三:自定义进程绑定策略
如果需要将计算密集型任务优先分配到P核,可手动指定核心列表:
- 运行
lstopo(hwloc工具)查看CPU拓扑,记录P核、E核的线程编号。 - 分批次指定进程绑定:
示例中假设0-15为P核的16个线程,16-23为E核的8个线程,可根据实际拓扑调整编号。mpirun -np 16 --bind-to core:0-15 你的MPI程序 : -np 8 --bind-to core:16-23 你的MPI程序
3. 验证配置效果
运行mpirun --display-map -n 24 true,查看输出是否显示24个slot;同时用top或htop观察进程运行的核心,确认P核与E核的负载分配符合预期。
内容的提问来源于stack exchange,提问作者ZL-Arctic

