Mega-MoE 代码导读(下篇):Pull、对称内存与 WGMMA Pipel
接续上篇warp 分工、Dispatch metadata、L1/L2、与 naive All-to-All 对照。本篇聚焦索引表与 Pull 的对应关系、对称内存 / rendezvous、L1 pool 握手、process_math_block与mbarrier / WGMMA协议。一、索引表写 vs Pull 读三维坐标是同一套1.1 写入494–501dst_rank_idxexpert_idx/kNumExpertsPerRank;dst_slot_idxatomicAdd_block(smem_expert_countexpert_idx,1);dst_ptrget_src_token_topk_idx_ptr(expert_idx%kNumExpertsPerRank,// local_expert在目标 rank 上sym_buffer.rank_idx,// source_rank发送方 本 rankdst_slot_idx);// slot*sym_buffer.map(dst_ptr,dst_rank_idx)token_topk_idx;维度变量含义[local_expert]expert % kNumExpertsPerRank目标 rank 上的 expert 编号[source_rank]sym_buffer.rank_idx谁发的[slot]dst_slot_idx该源 rank 发给此 expert 的第几个slot 按 (source_rank, expert) 独立编号rank0 有 0,1,2…rank1 也有自己的 0,1,2…。1.2 目标 rank 在哪不在表的第 4 维而在map的第二参数dst_rank_idxexpert_idx/kNumExpertsPerRank;*sym_buffer.map(dst_ptr,dst_rank_idx)...;get_src_token_topk_idx_ptr(...)按接收方 workspace layout算逻辑偏移map(ptr, dst_rank_idx)映到那台 GPU 的物理地址再写表物理上在 expert 所在 rank 的 workspace里所以不需要再存 dst_rank。1.3 Pull 读614–615src_token_topk_idx*get_src_token_topk_idx_ptr(current_expert_idx,// local_expertcurrent_rank_in_expert_idx,// source_ranktoken_idx_in_rank);// slot与写入一一对应。Round-robin 只负责pool 第 k 个位置 → 该查[local][哪个 source_rank][哪个 slot]。二、Pull Token 详解533 行起对应 naive MoEStep5 数据 All-to-All实现是接收方主动 pull不是dist.all_to_all。2.1 前置条件索引表、recv_count 已写好nvlink_barrier完成531 行sync_unaligned(Dispatch Math)两边对齐后再填/用 L1 pool2.2 资源绑定pull_buffersmem_send_buffers[warp_idx];// smem 中转pull_mbarrierdispatch_barriers[warp_idx];scheduler.fetch_expert_recv_count();// 每个 local expert 收几个 token2.3 工作分配for(token_idxsm_idx*kNumDispatchWarpswarp_idx;;token_idxkNumSMs*kNumDispatchWarps)token_idx 本 rank所有 received token 的全局序号跨 expert 排成长队。2.4 按 expert 分段548–567例expert0 收 100 个expert1 收 10 个expert2 收 30 个token_idx: 0..99 → expert0 100..109 → expert1 110..139 → expert2变量含义token_idx_in_expert该 expert 内第几个expert_pool_block_offset前面 expert 占几个 M-blockceil_div(tokens, BLOCK_M)pool_token_idxL1 pool 线性下标 offset * BLOCK_M token_idx_in_expert换 expert 时加载stored_rank_count[j] rank j 给当前 local expert发几个 token。2.5 Round-robin 选源 rank569–612目的pool 里 token 在源 rank 间交替排列避免 M 维上连续 token 都来自同一 rank。算法每轮取length min(remaining)每个还有货的 rank 各贡献length个 slot重复直到分完。例rank0→3rank1→5rank2→2共 10 个pool 序号source_rankslot0–50,1,2 各 2 个各 0,16–7rank0, rank1各 28–9rank13,4offset含义跳过完整轮次后offset length表示各 rank下一 token 从 slotoffset开始。token_idx_in_expert 7walkthrough第 1 轮num_round_tokens67≥6 →slot_idx1offset022第 2 轮num_round_tokens212 → rank1token_idx_in_rank 2(1/2)2查表[local_expert][rank1][slot2]2.6 三次搬运 通知 Math① TMA load远端 input_token_buffer[src_token_idx] → smem pull_buffer ② 并行 copy SF → l1_sf_buffer ③ 读 topk_weight → l1_topk_weights_buffer ④ TMA store → l1_token_buffer[pool_token_idx] ⑤ 写 TokenSrcMetadata {rank, token, topk}L2 scatter 用 ⑥ l1_arrival_countMath 侧 spin 等到够数再 TMA load A三、Dispatch 与 Math 对齐L1 pool 何时可填531 ↔ 901同一 barrierkDispatchWithEpilogueBarrierIdx侧时机Dispatch 531metadata 做完pull 前Math 901进scheduler.for_each_block前含义共享l1_token_buffer、l1_arrival_count等对齐后Dispatch开始填 poolMath开始等/读 pool按 M-block handshake不必等全部 pull 完676 ↔ 1809结束配对Math 算完后 Dispatch 才能清 workspace四、对称内存、rendezvous、map4.1 对称内存是什么各 rank同 layout、不同 base。buffersymm_mem.empty(num_bytes,...)handlesymm_mem.rendezvous(buffer,groupgroup)# kernel: handle.buffer_ptrs → 各 rank 基址表offsets[i]peer_base[i]-local_base;map(ptr,dst)ptroffsets[dst];≈ NVSHMEM 的「对称堆 相同 offset」不是表里的某一维。4.2 Rendezvous 是什么集体握手、交换各 rank buffer 的 GPU 物理地址建立 P2P/NVLink 寻址。之前只知道本机 base之后map(local_ptr, peer)能访问 peer 对称堆这是setup 阶段不是传 token 数据。之后还有group.barrier()保证全员就绪。4.3 为何不用nvshmem_float_pMega-MoE 用PyTorchsymm_mem 手写map操作做法小 metadata*map(ptr, dst) val、atomic_add_sys大块 tokentma_load_1d/tma_store_1d从 mapped 远端地址同步自研nvlink_barrier、mbarrier非 NVSHMEM quiet/barriermap≈nvshmem_ptrrendezvous 后直接 * / TMA 合法不要求 NVSHMEM 库 API。五、process_math_block与 WGMMA 协议5.1 结构setup 坐标valid_m、warpgroup 在 smem 的 offset ↓ K 维 pipelinefull.wait → 读 scale → WGMMA → empty.arrive → 融合 scale ↓ EpilogueL1 SwiGLU×weightFP8 / L2 BF16 scatter5.2 典型 WGMMA 序列L1full_barriers[stage]-wait(phase);warpgroup_fence_operand(accum[i]);warpgroup_arrive();// wgmma.fence.sync.alignedfor(k)WGMMA::wgmma(...);warpgroup_commit_batch();warpgroup_wait0();empty_barriers[stage]-arrive();// lane 0final_accumscale_a*weight_sf*accum;5.3 五步协议含义步骤作用fence_operand寄存器操作数对 WGMMA 可见arrivewarpgroup4 warp对齐smem 读必须在此之前wgmma异步集体 MMAcommit_batch把本批 WGMMA 划为一组无则wait无目标 → 死锁或脏读wait0等该批算完5.4full/emptymbarrier屏障waitarrive语义fullMathTMAarrive_and_expect_tx(N)smem满了可读emptyTMAMathsmem空了可覆盖arrive 报到 full 侧声明 TMA 字节数wait 阻塞直到条件满足phasestage 绕回时翻转parity 区分多轮复用与 WGMMA 的commit/wait分工full/empty管 TMA↔smemcommit/wait管 WGMMA↔寄存器。六、下篇知识串联单 token 生命周期[写索引] rank0 上 token 选中 global expert 5在 rank1 → map(..., dst_rank1) 写 rank1 表[local1][src0][slotk] [Pull] rank1 上 round-robin 得到 (src0, slotk) → 查表 → TMA 从 rank0 pull hidden/SF/weight → 写 l1_token_buffer[pool_idx]metadatal1_arrival_count [Math] full/empty pipeline WGMMA L1 → SwiGLU×weight → L2 WGMMA → map scatter 回源 rank combine buffer [Combine] 各 topk slot 累加 → y七、易混点速查问题答案表里有 dst_rank 吗没有表在接收方dst 由map(..., dst_rank_idx)指定token_idxvstoken_idx_in_expert前者跨 expert 全局序号后者 expert 内序号offset在 round-robin 里已跳过轮次中每个 rank 用掉的 slot 数累加lengthrendezvous vs nvlink_barrier前者地址 setup启动时后者kernel 内跨 rank 握手为何 531 要对齐 Math同时启动 pool 生产者–消费者避免竞态commit_batch 能省吗不能WGMMA 异步批次必须 commit 才能 wait八、代码索引下篇主题约略行号写索引 map494–501Pull 前 sync531Pull 主循环533–673expert 分段548–567round-robin569–612Math 侧 sync901process_math_block903–1770L2 scatter metadata1755–1765full/empty init374–379COMBINE1798–1925结语上篇回答「MoE 通信阶段在 kernel 里哪一段」下篇回答「表、对称内存、pool、GEMM pipeline 如何咬合」。读 Pull 时始终带三个问题查哪一格表map 到哪台 rankpool 第几行读 Math 时带两个问题full/empty 到哪一 stageWGMMA 批 commit 了吗把这两个链条理清Mega-MoE 后半段基本就通了。

相关新闻

VC++医院门诊收费系统优化:异步改造与性能提升实战

VC++医院门诊收费系统优化:异步改造与性能提升实战

1. 项目概述:为什么VC依然是医院核心业务系统的“定海神针”最近和几个在医院信息科工作的朋友聊天,他们都在为系统升级换代头疼。新来的年轻工程师总想用Java、.NET Core甚至Flutter来重写那些“老掉牙”的门诊收费系统,觉得VC(V…

2026/7/13 6:20:40阅读更多 →
数据科学面试避坑指南:9个致命错误与业务导向型解法

数据科学面试避坑指南:9个致命错误与业务导向型解法

1. 这不是“背题清单”,而是一份数据科学面试避坑实录我带过37个转行进数据科学的学员,也作为技术面试官参与过62场数据岗终面——从一线互联网大厂到金融风控团队,再到医疗AI初创公司。每次面试结束复盘,最常听到的反馈不是“算法…

2026/7/13 6:20:40阅读更多 →
C++ std::list 深度解析:双向链表的性能优势与实战应用

C++ std::list 深度解析:双向链表的性能优势与实战应用

1. 项目概述:为什么C程序员绕不开std::list?如果你刚开始学习C的STL(标准模板库),在熟悉了vector和array之后,下一个大概率会遇到的容器就是std::list。很多教程会告诉你,它是一个“双向链表”&…

2026/7/13 6:20:40阅读更多 →
EM3080-W条码扫描模块与PIC18F86J11的工业应用解析

EM3080-W条码扫描模块与PIC18F86J11的工业应用解析

1. EM3080-W模块的工业级特性解析EM3080-W这款条形码扫描模块在工业自动化领域已经建立了良好的口碑。作为一款采用CMOS图像传感器和专用解码芯片的集成化解决方案,它最令我印象深刻的是其惊人的100次/秒扫描速度。这个指标意味着在传送带分拣场景下,即使…

2026/7/13 7:35:46阅读更多 →
3分钟掌握Seraphine:英雄联盟玩家的智能BP与战绩分析神器

3分钟掌握Seraphine:英雄联盟玩家的智能BP与战绩分析神器

3分钟掌握Seraphine:英雄联盟玩家的智能BP与战绩分析神器 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 在英雄联盟排位赛中,你是否曾因BP阶段手忙脚乱而错失先机?是否希望…

2026/7/13 7:35:46阅读更多 →
2026不容错过!深度测评5款适配多学科的AI论文写作工具,初稿轻松搞定

2026不容错过!深度测评5款适配多学科的AI论文写作工具,初稿轻松搞定

还在为写期刊论文而感到困扰吗?面对海量的文献、繁琐的格式要求以及反复的修改,低效率已经成为大多数学术人士的共同苦恼!但你无需再烦恼,接下来介绍的这四款AI论文写作工具将帮助你轻松克服这些难题。无论是进行文献检索、生成论…

2026/7/13 7:35:46阅读更多 →
如何5分钟掌握百度网盘提取码智能查询:baidupankey终极指南

如何5分钟掌握百度网盘提取码智能查询:baidupankey终极指南

如何5分钟掌握百度网盘提取码智能查询:baidupankey终极指南 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘资源下载而烦恼吗&#xff1f…

2026/7/13 7:35:46阅读更多 →
LAV Filters终极指南:5步实现Windows专业级视频播放体验

LAV Filters终极指南:5步实现Windows专业级视频播放体验

LAV Filters终极指南:5步实现Windows专业级视频播放体验 【免费下载链接】LAVFilters LAV Filters - Open-Source DirectShow Media Splitter and Decoders 项目地址: https://gitcode.com/gh_mirrors/la/LAVFilters 在Windows平台上播放视频时,你…

2026/7/13 7:35:46阅读更多 →
文件超100MB就传不了?这个本地Agent没这限制

文件超100MB就传不了?这个本地Agent没这限制

你的文件一超过100MB,AI就罢工了? 试过这类场景吗: 一份200MB的CSV销售明细,拖进AI工具提示「文件超出大小限制」一份百万行的物流记录,上传到云端等了五分钟,直接超时报错想把近12个月的财务流水合并分析&…

2026/7/13 7:30:45阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/13 4:47:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/13 0:50:34阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/13 4:52:09阅读更多 →
卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

研究痛点提出(提出问题)重组肠激酶是融合标签切除核心工具酶,当前原核表达体系存在三大标准化难题,直接阻碍可复现的蛋白质分离纯化流程搭建:Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体,沉淀占比超 9…

2026/7/13 0:04:58阅读更多 →
语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text …

2026/7/13 0:04:58阅读更多 →
Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:04:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/13 4:21:17阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/13 4:08:53阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/12 21:43:43阅读更多 →