graph TB
    A[开始 P2P 通信] --> B["p2pCanConnect()<br/>检查连接能力"]
    
    B --> C{能否 P2P 连接?}
    C -->|否| D[返回失败]
    C -->|是| E["p2pGetInfo()<br/>确定 P2P 类型和读写模式"]
    
    E --> F{P2P 类型判断}
    F --> G["P2P_DIRECT<br/>同进程直接指针"]
    F --> H["P2P_IPC<br/>传统CUDA IPC"]
    F --> I["P2P_CUMEM<br/>cuMem API"]
    F --> J["P2P_INTERMEDIATE<br/>中间节点"]
    
    G --> K[发送端设置阶段]
    H --> K
    I --> K
    J --> K
    
    K --> L["p2pSendSetup()<br/>发送端初始化"]
    L --> M["ncclP2pAllocateShareableBuffer()<br/>分配可共享发送内存"]
    M --> N["ncclProxyConnect()<br/>建立代理连接"]
    N --> O["p2pMap()<br/>映射内存"]
    
    O --> P[接收端设置阶段]
    P --> Q["p2pRecvSetup()<br/>接收端初始化"]
    Q --> R["ncclP2pAllocateShareableBuffer()<br/>分配可共享接收内存"]
    R --> S["ncclProxyConnect()<br/>建立代理连接"]
    S --> T["p2pMap()<br/>映射内存"]
    
    T --> U[连接阶段]
    U --> V["p2pSendConnect()<br/>发送端连接"]
    U --> W["p2pRecvConnect()<br/>接收端连接"]
    
    V --> X["ncclP2pImportShareableBuffer()<br/>导入远程内存"]
    W --> Y["ncclP2pImportShareableBuffer()<br/>导入远程内存"]
    
    X --> Z["设置缓冲区指针和控制结构"]
    Y --> Z
    
    Z --> AA{是否使用 CE memcpy?}
    AA -->|是| BB["p2pSendProxyConnect()<br/>启用 CUDA 流复制"]
    AA -->|否| CC[直接内存访问设置完成]
    
    BB --> DD["p2pSendProxyProgress()<br/>异步复制进度管理"]
    CC --> EE[完成 P2P 设置]
    DD --> EE
    
    EE --> FF[开始数据传输]
    
    subgraph "清理阶段API"
        SS["p2pSendFree()<br/>发送端资源释放"]
        TT["p2pRecvFree()<br/>接收端资源释放"]
        UU["p2pSendProxyFree()<br/>发送代理释放"]
        VV["p2pRecvProxyFree()<br/>接收代理释放"]
    end
    
    FF --> SS
    FF --> TT