Skip to content

Heterogeneous Dispatch

Wiseung Jang edited this page Jul 7, 2026 · 1 revision

MMSE_CPP 的底层架构设计中,我们面临着 4G/5G 物理层基带处理的一个核心技术矛盾:极低延迟 (Ultra-Low Latency) 与 海量吞吐 (Massive Throughput) 之间的取舍

为了在不同的通信场景下都能达到极致的性能表现,本引擎没有采用“一刀切”的单处理器方案,而是设计了一套智能的异构调度机制 (Heterogeneous Dispatcher),在 CPU (AVX2/AVX-512) 与 GPU (CUDA) 之间动态分配负载。


1. 硬件特性的博弈 (The Hardware Trade-off)

基带信号处理并非总是“扔进 GPU 就会更快”。调度器必须深刻理解两种处理器的底层行为:

🟢 CPU 路径 (AVX2 / AVX-512)

  • 优势真正的零拷贝 (Zero-Copy)。射频前端送来的 IQ 网格数据直接驻留在主存 (DRAM) 与 L3 Cache 中。CPU 发起一次 AVX 指令调用的延迟在纳秒级别 (ns)。它极其擅长处理伴随复杂控制流 (Control Flow) 的细碎任务。
  • 劣势:在面对全带宽 (如 100 PRBs)、高阶 MIMO 或多小区并发时,有限的 CPU 核心数和内存带宽会被迅速耗尽。
  • 适用场景:控制面解析 (PCFICH/PDCCH)、VoLTE 等小包数据调度、URLLC (超可靠低延迟) 业务。

🔵 GPU 路径 (NVIDIA CUDA)

  • 优势:拥有数千个流处理器和恐怖的显存带宽 (VRAM)。对于庞大且规则的矩阵运算,它能提供降维打击般的吞吐量。
  • 劣势PCIe 搬运税 (PCIe Tax) 与启动开销。每次调度都需要经历 H2D 拷贝 -> Kernel 启动 -> D2H 拷贝。如果计算量不够大,总耗时反而会比 CPU 更长。
  • 适用场景:数据面解析 (PDSCH)、Massive MIMO、多扇区 (Multi-Sector) 批处理并发。

2. 动态路由与调度策略 (Routing Strategy)

MMSE_CPP 在引擎入口处实现了一个轻量级的路由层。当 ARM/主控线程下发一个调度指令(如 ExtractDescriptor)时,调度器会基于以下两个核心策略进行派发:

策略 A:基于信道类型 (Channel-Based Routing)

控制信道和数据信道在物理层流水线中的优先级不同:

  • 控制信道 (PCFICH / PDCCH) 具有极其严苛的时序依赖。必须立刻解出 PDCCH 的 DCI,才能知道后续 PDSCH 的位置。因此,所有控制面的信道估计与均衡强制绑定到 CPU (AVX2) 极速路径,省去一切 PCIe 开销,确保盲检任务在几微秒内点火。
  • 数据信道 (PDSCH) 的 LLR 生成相对宽容,可以容忍流水线深度的增加,因此优先考虑投递给 GPU。

策略 B:基于负载阈值 (Workload Thresholding)

对于 PDSCH 数据信道,调度器会动态评估当前描述符 (Descriptor) 中的负载量。 系统预设了一个经验性的 GPU_PRB_THRESHOLD(可通过基准测试工具校准):

  • 当分配的资源块 num_allocated_prbs < THRESHOLD(例如只有寥寥几个 PRB 的微信心跳包)时,调度器会将其拦截并转交给 CPU 处理,以避免“杀鸡用牛刀”导致的 PCIe 延迟倒挂。
  • num_allocated_prbs >= THRESHOLD(如观看 4K 视频的大文件下载)时,调度器将其打包送入 CUDA 异步流水线。

3. 架构实现细节 (Implementation Details)

为了让异构调度对上层业务透明,我们在底层工程中采用了以下设计模式:

3.1 统一内存池 (Unified Pinned Memory)

异构调度的首要前提是内存必须对 CPU 和 GPU 都友好。 引擎的资源网格 (Resource Grid) 统一使用 cudaHostAlloc 申请的锁页内存 (Pinned Memory / Page-locked)

  • 当任务分配给 CPU 时,CPU 直接在主存上以最高速度进行 AVX 寻址。
  • 当任务分配给 GPU 时,GPU 的 DMA 控制器可以直接从物理内存中拉取数据,无需经过操作系统的 Pageable 内存中转,带宽翻倍。

3.2 异步下发流 (Fire-and-Forget)

无论任务走向何方,调度器的 API 都是异步的:

// 异构调度器的概念代码
void BasebandEngine::dispatch_pdsch_task(const PdschExtractDescriptor& desc, ResourceGrid* grid) {
    if (desc.num_allocated_prbs < GPU_PRB_THRESHOLD) {
        // 投递给 CPU 线程池 (AVX2 路径)
        cpu_thread_pool.submit([=]() {
            avx2_equalizer.run(desc, grid);
        });
    } else {
        // 投递给 CUDA 异步流流水线
        cuda_pipeline.submit_async(desc, grid);
    }
}