One CPU actually hides three 'compute engines': P/E-core CPU, the Arc iGPU, and an NPU everyone treats as decoration. On a Core Ultra 5 235H (14-core CPU + Arc 140T sharing 12GB + Intel AI Boost NPU) I ran YOLOv8n→OpenVINO FP16 person detection, pushed all three lanes from single-process to dual-hardware hybrid pool, and built the full throughput ladder — the headline might surprise you: the hybrid pool hits 7.5× a single NPU core.
Env: Core Ultra 5 235H / Arc 140T iGPU (12GB shared) / Intel AI Boost NPU / OpenVINO 2026.5.0.dev (devices: CPU/GPU/NPU) / yolov8n_openvino_model (FP16, exported from yolov8n.pt) / conf=0.25, classes=[0] person / per-frame predict, one sampled frame per second. Tested 2026-09-12.
The single-device ceiling
First, the single-device frames-per-second numbers. One vital premise: frames were pulled with ffmpeg, not cv2 full decode — an earlier 'GPU is slow' conclusion was entirely cv2-decode path noise; that's dissected in the pitfalls article.
| Config | FPS | Notes |
|---|
| NPU 1 进程 | 32 | single NPU core |
| NPU 3 进程 | 72 | NPU ceiling |
| GPU 1 进程 | 65.6 | iGPU, 1 process |
| GPU 2 进程 | 99 | |
| GPU 3 进程 | 131.5 | |
| GPU 4 进程 | 147.8 | iGPU peak |
| GPU 6 进程 | 147 | saturated |
Lots to unpack: single-process numbers underrate these parts — you must multi-process to feed them. The iGPU at 4 processes (147.8) is 2.25× the single-process 65.6, and 6 processes dips back → the iGPU saturates around 150 FPS. The NPU peaks at 72 with three processes, no further gains beyond.
Throughput per config (FPS)
NPU×132
NPU×372
GPU×165.6
GPU×4147.8
混合 GPU×4+NPU×3240
Doubles: GPU + NPU in parallel
Obvious but often missed: the NPU and iGPU are two independent chips. If they don't fight, give each pool its own processes and split the file queue by ratio. Zero scheduling contention, pure stacking:
| Config | FPS | Notes |
|---|
| 混合 GPU2+NPU2 | 188.6 | balanced |
| 混合 GPU3+NPU3 | 238 | no contention |
| 混合 GPU4+NPU3(生产) | ~240 | recommended config |
GPU×4 + NPU×3 holds ~240 FPS, exactly 7.5× a single NPU core. For massive frame-sampling jobs like surveillance person detection, this turns 'detection' from the bottleneck into a nearly-free step.
gpu_ratio: how to split the queue without idle waits
A 1:1 split is actually suboptimal — the two chips have different appetites. Split by capability and both sides finish together. Here's a ratio sweep (0606 copy, 60 files / 3593s):
| gpu_ratio | detect time | × realtime |
|---|
| 0.5 | 18.3s | 197x |
| 0.55 | 17.2s | 209x |
| 0.58 | 17.0s | 212x |
| 0.6 | 16.7s | 216x |
| 0.62 | 17.0s | 211x |
| 0.7 | 19.0s | 189x |
The sweet spot is 0.6: the iGPU is stronger (147 vs 72), so giving it 60% of the queue makes both chips land at once; too little starves the iGPU, too much and it trails. 0.5→0.6 saves under 2s, but 0.7 slides back to 19s — getting the ratio right is free throughput.
Sampling: you don't need every frame
The goal of person detection is video cutting, so one frame per second is already plenty. If a few seconds of cutting error is acceptable, you can dilute the workload 3× or 5× and detection time collapses:
| interval | pad | detect time | × realtime |
|---|
| 1s | 0 | 16.5~23.2s | 155~218x |
| 3s | 3 | 8.0~8.4s | 429~450x |
| 5s | 3 | 4.8~5.6s | 640~751x |
Production lands on interval=3, pad=3: 1/3 the inferences, ~3× faster, and the 3s pad on both sides actually lifts activity coverage (52%→56%). Once inference stops being the bottleneck, detection outruns frame extraction itself.
TL;DR
- Single-process always underrates the part: the iGPU needs 4 processes for 147.8 FPS, the NPU tops at 72 with 3
- NPU + iGPU stack independently: GPU×4+NPU×3 holds 240 FPS = 7.5× a single NPU, no contention
- Split by capability: gpu_ratio=0.6 is optimal; 0.5 and 0.7 are both slower
- Sampling dilution pays: every-3s + pad lets detection finish an hour of video in 8s (~440× realtime)
Heads-up:These are YOLOv8n (FP16) numbers on this driver/OpenVINO build; model size, resolution (e.g. 640x360 pipeline) or iGPU shared-memory settings will shift the absolute values, but 'multi-process to feed + ratio-split dual pool' holds. Full pipeline:
surveillance person-cut; pitfalls:
NPU inference pitfalls.