91 lines
5.6 KiB
Markdown
91 lines
5.6 KiB
Markdown
---
|
||
tags:
|
||
aliases:
|
||
- 2.2 异构 DMA 与内存传输机制 (Heterogeneous DMA & Memory Transfer Mechanism)
|
||
date created: 星期四, 十一月 20日 2025, 11:23:39 晚上
|
||
date modified: 星期四, 十一月 20日 2025, 11:23:49 晚上
|
||
---
|
||
|
||
# 2.2 异构 DMA 与内存传输机制 (Heterogeneous DMA & Memory Transfer Mechanism)
|
||
|
||
- **概要**: 本节定义 Host CPU 与 Device GPU (Iluvatar MR-V100) 之间的高速数据移动策略。鉴于物理链路为 **PCIe 4.0 x8 (降级)** 且存在 **NUMA 架构** 风险,本设计确立了以 **“锁页内存池 + 双流乒乓 + NUMA 本地化”** 为核心的传输基线,旨在最大化 PCIe 有效带宽并掩盖传输延迟。
|
||
|
||
## 1\. 核心基线总览 (Baseline Matrix)
|
||
|
||
| 决策领域 | 核心基线 (Baseline) | 关键技术/配置 (Key Specs) | 依据/收益 |
|
||
| :--- | :--- | :--- | :--- |
|
||
| **2.2.1 内存分配** | **锁页内存 + UVA 映射** | `cudaMallocHost` <br> Flags: `cudaHostAllocMapped` | 规避 OS 分页开销,启用 GPU 直接寻址能力。 |
|
||
| **2.2.2 传输调度** | **双流乒乓 (Double Buffering)** | 2x `cudaStream_t` (NonBlocking) <br> 3-Stage Pipeline (H2D/Kernel/D2H) | 实现计算与通信的**完全重叠**,掩盖 PCIe 物理延迟。 |
|
||
| **2.2.3 物理亲和性** | **NUMA Node 0 本地化** | 运维: `numactl --cpunodebind=0 --membind=0` <br> 代码: `pthread_setaffinity_np` | **P0 级修正**。消除跨 QPI 总线访问导致的 20-40% 延迟抖动。 |
|
||
| **2.2.4 零拷贝策略** | **混合策略 (Hybrid)** | **控制流**: Zero-Copy (UVA + WriteCombined) <br> **数据流**: Explicit Async DMA | 兼顾小数据的低延迟与大数据的高吞吐,避免 TLB Thrashing。 |
|
||
| **2.2.5 传输粒度** | **块级聚合 (Coarse-Grained)** | Min Size: **64KB** <br> Alignment: **256 Bytes** | 摊薄 PCIe TLP 协议头开销,提升有效载荷占比至 \>80%。 |
|
||
| **2.2.6 显存布局** | **Range-Contiguous + Pitch** | Layout: `[Channel][Pulse][Range]` <br> Type: `float2` (Interleaved) | 适配 `cuFFT` 格式,满足 GPU 合并访问 (Coalesced Access) 要求。 |
|
||
|
||
-----
|
||
|
||
## 2\. 关键机制深度解析
|
||
|
||
### 2.2.1 锁页内存管理与分配策略 (Page-Locked/Pinned Memory Management)
|
||
|
||
- **分配策略**: 严禁使用 `new/malloc`。必须在系统初始化阶段 (`initialize`) 使用 `cudaMallocHost` 预分配所有 H2D 缓冲区。
|
||
- **UVA 启用**: 必须设置 `cudaHostAllocMapped` 标志,使 CPU 内存映射到 GPU 统一地址空间,为零拷贝提供支持。
|
||
- **内存池管理**: 采用静态预分配策略。
|
||
- **Pool Size**: 默认为 **256MB**。
|
||
- **Block Size**: 固定为 **64KB**,与传输粒度对齐。
|
||
|
||
### 2.2.2 异步流水线与计算通信重叠 (Asynchronous Pipelining)
|
||
|
||
- **架构模型**: **双流乒乓 (Ping-Pong)**。
|
||
- Stream 0 处理 Buffer A (Kernel 计算) 时,Stream 1 同时搬运 Buffer B (H2D 传输)。
|
||
- **API 规范**:
|
||
- 流创建: `cudaStreamCreateWithFlags(…, cudaStreamNonBlocking)`。
|
||
- 传输: `cudaMemcpyAsync(…, stream_id)`。
|
||
- 同步: 严禁使用 `cudaDeviceSynchronize()`,仅允许 `cudaStreamSynchronize()` 或 `cudaEventSynchronize()`。
|
||
|
||
### 2.2.3 NUMA 感知的内存亲和性控制 (NUMA-Aware Affinity)
|
||
|
||
- **物理基线修正**: 假定服务器已按主板手册调整,GPU 物理挂载于 **Node 0**。
|
||
- **强制约束**:
|
||
- **进程级**: 启动脚本必须包含 `numactl --cpunodebind=0 --membind=0`。
|
||
- **线程级**: `ExecutionEngine` 的 I/O 线程和 Worker 线程必须显式绑定到 Node 0 的物理核心 (Core 0-15)。
|
||
- **First-Touch**: `cudaMallocHost` 的调用必须发生在已绑定亲和性的线程中,确保物理页分配在本地 DRAM。
|
||
|
||
### 2.2.4 统一虚拟寻址与零拷贝技术 (UVA & Zero-Copy)
|
||
|
||
- **场景 A: 控制参数 (波控码/状态字)**
|
||
- **策略**: **Zero-Copy**。
|
||
- **配置**: `cudaHostAllocWriteCombined`。
|
||
- **行为**: CPU 写入 Write-Combine Buffer,GPU Kernel 直接通过 PCIe 读取 Host 内存,无 DMA 启动开销。
|
||
- **场景 B: 原始回波 (I/Q Data)**
|
||
- **策略**: **Explicit DMA**。
|
||
- **行为**: 维持 `cudaMemcpyAsync` 到 VRAM。避免 GPU Kernel 频繁跨 PCIe 访问导致计算单元饥饿。
|
||
|
||
### 2.2.5 传输粒度与 TLP 效率优化 (TLP Efficiency)
|
||
|
||
- **最小粒度**: **64KB**。严禁单包 (9KB) 传输。
|
||
- **触发机制**:
|
||
- **空间触发**: 填满一个 64KB 内存块。
|
||
- **时间触发**: 超时 **200us** 未填满则强制推送。
|
||
- **对齐约束**: 传输的目标地址 (Device Pointer) 必须 **256 字节对齐**,适配 GPU 内存控制器的最佳访问步长。
|
||
|
||
### 2.2.6 显存布局与对齐约束 (VRAM Layout)
|
||
|
||
- **数据类型**: `float2` (Interleaved Complex),直接适配 `cuFFT`。
|
||
- **物理排列**: **Channel-Major, Pulse-Major, Range-Contiguous** (`[C][P][R]`)。
|
||
- **Range 维**作为最内层连续维度,确保 FFT 和脉冲压缩时的合并访问。
|
||
- **Padding 策略**: 使用 `cudaMallocPitch` 分配显存。确保每一行(即每个脉冲)的起始地址满足 256 字节对齐,消除换行时的非对齐访问惩罚。
|
||
|
||
-----
|
||
|
||
## 3\. 关键配置参数速查 (Configuration Cheat Sheet)
|
||
|
||
| 参数名称 | 推荐值/设置 | 来源/约束 |
|
||
| :--- | :--- | :--- |
|
||
| `buffer.packet_block_size_kb` | **64** | |
|
||
| `gpu_resources.stream_count` | **3** (Min 2) | 支持 H2D/Comp/D2H 三级流水 |
|
||
| `gpu_resources.device_memory_mb`| **1024** | |
|
||
| `Min Transfer Size` | **64KB** | 2.2.5 基线 |
|
||
| `Alignment` | **256 Bytes** | 2.2.5 / 2.2.6 基线 |
|
||
| `NUMA Node` | **0** | 2.2.3 基线 (修正后) |
|
||
| `MTU` | **9000** | 2.1.2 基线 |
|