Files
matmul-analysis/BMM/req.txt

402 lines
68 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

《BMM尾轮处理策略对比分析_v1.4》文档还需要优化,尤其在 “五、周长型主导完整推导”中
1、 在“5.4 数值实例”中说的“例 4周长型、Batch 与 C 互素的极端整除代价)” 这个对比对于方案B显然有些不公平真正方案B也不会设计的这么不合理也不是必须每轮每个核都要用起来否则这个整除的约束太强了可以允许尾轮只用到80%的核但是切分还是所有分块都要重新切分所有分块都改成新的SingleCoreM、SingleCoreN请基于这个假设全面审视、重新公式推导、分析对比
这是一个复杂任务请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于《BMM尾轮处理策略对比分析_v1.4》文档增量修改完善写出《BMM尾轮处理策略对比分析_v1.5》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析文件不要动别的文件本req.txt文件也应该同步到代码仓的BMM文件夹下
-------------------------------------------
《BMM尾轮处理策略对比分析_v1.3》文档还需要优化,
1、你在“七、方案 B 的简化形态 B1 与 B0/B1 相对 A1b 的损失分析”中常说“方案 B 常不可行”这样说法是不合适的我看了你的推导逻辑无非是因为不能整除而产生冗余浪费的问题这个不能叫不可行这就是这个方案B的问题这些场景case你要给出方案B所能达到的最优性能然后按公式逻辑推理并分析它与方案A1b的损失是多少
这是一个复杂任务请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于《BMM尾轮处理策略对比分析_v1.3》文档增量修改完善写出《BMM尾轮处理策略对比分析_v1.4》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析文件不要动别的文件
-------------------------------------------
《BMM尾轮处理策略对比分析_v1.3》文档还需要优化,
1、在“7.2 B0/B1 相对 A1b 的损失分析v1.3 按修正模型重写)” 中有些时候B表示方案B有些时候B表示Batch但你都统一用B会有些区分不清楚请将描述中的B进行规范清晰的描述如果B表示的是方案就说方案B如果B表示的是Batch就说Batch
请修改完善《BMM尾轮处理策略对比分析_v1.3》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析文件不要动别的文件
-------------------------------------------
《BMM尾轮处理策略对比分析_v1.2》文档还需要优化,
1、“2.1 单块时延三项” 中 T_MTE2的分子里为什么是kL1而不是K应该是K吧T_MMAD和T_FIXPIPE都是完成整个SingleCoreM、K、SingleCoreN的时间T_MTE2怎么能只是完成kL1的时间呢
2、 “2.5 首轮切分基准(近方形的来源与适用条件)” 这一章节不能简单的用语言这样描述,要有严谨的公式推导和证明,并小结重要结论,这个过程一定要清晰严谨,一定会不断被人挑战,你的推导一定要经得起挑战
3、“4.3 A1 vs B”中的公式直接这样写看不懂边长s是不是=sM+sN?那S_A1b和S_B又表示什么是读入数据的搬移总量吗搬移总量没有K吗
这是一个复杂任务请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于《BMM尾轮处理策略对比分析_v1.2》文档增量修改完善写出《BMM尾轮处理策略对比分析_v1.3》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析文件不要动别的文件
-------------------------------------------
《BMM尾轮处理策略对比分析_v1.1》文档还需要优化尤其是“7.2 B0/B1 相对 A1b 的损失分析” 章节
1、“7.2 B0/B1 相对 A1b 的损失分析” 需要在交代清楚一些、分析扎实一些具体这个损失5.4%、16.6%甚至30%这些数据是如何一步步推导出来的?
2、我看你的损失分析是基于 “理论,方形近似”的假设基础上,这个假设是否可靠,如果非方形还是一定有损失吗?还是会损失这么多吗?请仔细分析
3、目前主要的大模型推理中的实际的BMM的case大多是基于prefilldecode场景下的BMM的case这些case中如果是Prefill场景其BMM的case的B往往在2~128、M典型4k~128k、K典型128~10240、N典型128~10240如果是Decode场景其BMM的case的B往往在2~128、M典型1~128、K典型128~10240、N典型128~10240那么在这些主流的典型的prefilldecode场景下的BMM的caseB0/B1 相对 A1b 的损失分析是怎么样的?
这是一个复杂任务请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于《BMM尾轮处理策略对比分析_v1.1》文档增量修改完善写出《BMM尾轮处理策略对比分析_v1.2》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析文件不要动别的文件
-------------------------------------------
《BMM尾轮处理策略对比分析》文档还需要优化这个文档也是“ASW_Basic分支分析”下的应该放在“ASW_Basic分支分析”子目录下有几点请注意检查如有必要请对应修改
1、ASW_Basic分支 是兜底分支,进入前面几个如特殊分支\转Matmul\MergeBatch\IterBatch\StreamK的case不会进入 ASW_Basic分支 自然的那些case在 几个备选策略下的表现 也可以不对比
2、请专门对比下如果完全采用方案B是否可以先算一个基于B\M\K\N\dtype的条件或门限当访存Bound时如果满足条件就直接按整数轮满核切当算力Bound时直接按整数轮满核切这个方案可以叫B1之前的方案B叫B0
3、请比较下如果完全采用B0或B1相对于方案A1b哪些场景case会有损失最大会有多少损失
这是一个复杂任务请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于《BMM尾轮处理策略对比分析_v1.0》文档增量修改完善写出《BMM尾轮处理策略对比分析_v1.1》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析文件不要动别的文件
-------------------------------------------
目前“BMM算子优化分析_Release”目录下的文件有点乱请按我的要求进行调整
1、在“BMM算子优化分析_Release”目录下新建一个文件夹叫“ASW_Basic分支分析”把 “ASW_Basic分支分析” 开头的文件全部放到新建的“ASW_Basic分支分析”文件夹下
2、把《ASW_Basic分支分析_v1.91》中的 "5.10 尾轮处理的第二种策略:整轮均匀重切" 章节单独拿出来写成一篇独立的分析文档尽量不要引用《ASW_Basic分支分析_v1.91》或本地其他文档,如果需要引用,则需要将相关推导一并放进来,只能引用外部互联网上的链接或文章
请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨新增文档还是以markdown和html格式交付并同步到仓库不要动别的文件
-------------------------------------------
《ASW_Basic分支分析_v1.9》中的 "5.10 尾轮处理的第二种策略:整轮均匀重切" 章节还需要修改优化
1、我理解A1a方案应该是A1b方案的子集A1a方案的尾轮所有切分A1b都应该能取到A1b应该恒优于A1a吧
2、我更想 确认的是能否通过公式推导明确A1b是否也能恒优于方案B我看到你在总结时说访存Bound有个场景 B 可能更优?是这样吗?有没有严格的推导证明?请补充分析及公式推导证明
请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于《ASW_Basic分支分析_v1.9》文档增量修改完善写出《ASW_Basic分支分析_v1.91》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析的Matmul相关文件不要动别的文件
-------------------------------------------
《ASW_Basic分支分析_v1.8》中的 "5.10 尾轮处理的第二种策略:整轮均匀重切" 章节还需要修改优化
1、你说计算Bound时A1b的方案存在16对齐的问题而产生覆盖浪费好像B就没有这个浪费这个说法是有问题的这个16对齐的约束是一样的不管是A1b的尾轮重切还是B的全部重切重切后的SingleCoreM、SingleCoreN都是要16对齐的哪怕重切前一般也是要求SingleCoreM、SingleCoreN要是16的倍数A0、A1a、A1b、B这几个方案的实现大致方案 要在5.10的开头稍微解释介绍下你要重新审视下5.10的全部推导公式和过程,刷新分析过程和结论
2、在5.10章节的SingleCoreM、SingleCoreN分析中都是默认正方形即SingleCoreM=SingleCoreN这个结论在5.2章节中有推导要严格审视下5.2的这个推导是否严谨、是否合理从第一性原理角度是否好解释这个SingleCoreM=SingleCoreN的结论
请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于《ASW_Basic分支分析_v1.8》文档增量修改完善写出《ASW_Basic分支分析_v1.9》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析的Matmul相关文件不要动别的文件
-------------------------------------------
《ASW_Basic分支分析_v1.7》中的 "5.10 尾轮处理的第二种策略:整轮均匀重切" 章节还需要修改优化
1、在计算Bound A0 vs A1时如果r>C/2A1 也不用退化为 A0A1也可以非整数的切SingleCoreM、SingleCoreN例如把尾轮的SingleCoreM、SingleCoreN变成原来的0.9倍实际操作时应该是按16往下减 例如SingleCoreM_new = SingleCoreM -16
2、“三策略决策总表”这个表格非常好要留着能不能再推导分析一个直接基于B、M、K、N就能判断到底A0、A1、A2谁最优的表格尝试分析推理分析总结一下
请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于《ASW_Basic分支分析_v1.7》文档增量修改完善写出《ASW_Basic分支分析_v1.8》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析的Matmul相关文件不要动那个文件夹
-------------------------------------------
《ASW_Basic分支分析_v1.7》中的 "5.10 尾轮处理的第二种策略:整轮均匀重切" 章节还需要修改优化
1、我希望你在算子为算力Bound、访存Bound的不同场景下分别比较的是在按5.1和5.2计算完BaseM、BaseN、SingleCoreM、SingleCoreN后策略A0尾轮不再重切、策略A1仅尾轮重切、策略B全部重切这三个策略的优劣和适用条件分界先比较A0和A1的优劣并通过公式推导找出适用条件分界再比较A0和B的优劣并通过公式推导找出适用条件分界最后比较A1和B的优劣并通过公式推导找出适用条件分界推导公式一定要完整、逻辑一定要严谨
请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨修改完善《ASW_Basic分支分析_v1.7》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析的Matmul相关文件不要动其他文件
-------------------------------------------
《ASW_Basic分支分析_v1.6》中的理论最优实现方案希望你进行一些补充分析:
1、目前的最优实现是在不考虑是否每轮核都能用满的情况下GM->L1重复读尽量少SingleCoreM\N尽量大,进而mCnt\nCnt尽量少重复读就会尽量少、搬移效率尽量高这些前提下进行的SingleCoreM\N的确定由此带来的可能存在尾轮核用不满的情况然后再针对尾轮是否算力bound或访存bound单独判断尾轮是否独立切分现在有另外一种后选思路就是不做尾轮和前面主要轮次的差异化的SingleCoreM、SingleCoreN即每一轮的每个分块的SingleCoreM、SingleCoreN都一样具体做法是先按当前理论最优实现方案首次确定SingleCoreM、SingleCoreN后先算完成全部分块需要全核工作多少轮例如1.125轮即第一轮32个核第二轮只有4个核参与每个核做SingleCoreM、K、SingleCoreN如果轮次非整数直接向上取整(ceil(1.125)=2)再以向上去整后的轮次例如2轮共64核次参与就是需要切分出B*mCnt*nCnt=64个分块重新切分SingleCoreM和SingleCoreN以达成这么多分块(例如64分块),当然在新轮次(分块数)确定后要以重复读尽量少优先、搬移效率尽量大次优先为优化目标来确定新的SingleCoreM和SingleCoreN如此一来相比于不重新切分也就是尾轮核用不满的情况在B、M、K、N、dtype满足什么条件下适合做SingleCoreM和SingleCoreN的重新切分可以按算子是算力Bound还是访存Bound分不同情况讨论
请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于《ASW_Basic分支分析_v1.6》文档增量修改完善写出《ASW_Basic分支分析_v1.7》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析的Matmul相关文件不要动那个文件夹
-------------------------------------------
《ASW_Basic分支分析_v1.5》文档还需要继续完善请分别细致详细的画出源码的ASW_Basic分支的程序实现流程图、文档理论最优实现的程序实现流程图从一个case的B、M、K、N、dtype输入开始直到所有tiling&swizzle实现参数都能被清晰的计算出来
请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于《ASW_Basic分支分析_v1.5》文档增量修改完善写出《ASW_Basic分支分析_v1.6》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析的Matmul相关文件不要动那个文件夹
-------------------------------------------
我在看昇腾950PR的Cube核中的Fixpipe中的UnitFlag这个特性这个UnitFlag特性似乎可以很好的将MMAD矩阵计算写入L0C和L0C->Fixpipe->GM进行很好的流水好像开了这个特性T_Fixpipe和T_MMAD就可以很好的掩盖了最多剩一个小小的16*16的尾巴Fixpipe输出不可掩盖这个小尾巴几乎可以忽略如果这个UnitFlag特性这么好的话是不是没有必要在L0C上开double buffer了因为L0C上开double buffer也是为了将T_Fixpipe和T_MMAD进行流水掩盖如果这个UnitFlag特性这么好的话为什么batch_mat_mul_v3算子中还有些在L0C上开double buffer的场景呢L0C上开double buffer和这个unitFlag特性的适用条件边界在哪里请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨单独输出一篇分析文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析的Matmul\BMM相关文件不要动其他文件
官方参考文献:
https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/latest/API/ascendcopapi/docs/zh/api/SIMD-API/%E5%9F%BA%E7%A1%80API/cube_compute_TensorAPI/Mmad%E8%AE%A1%E7%AE%97%E5%85%B3%E9%94%AE%E7%89%B9%E6%80%A7%E8%AF%B4%E6%98%8E/UnitFlag.md
-------------------------------------------
《ASW_Basic分支分析_v1.5》文档还需要继续完善,关于 “SingleCoreM/N 的具体确定过程”的“若 P > 1”这块讲的不清楚如何开始只需要检查约束2/3/4就行了吗满足约束2/3/4的有多个组合怎么办呢如何选取最优的呢
逻辑要连贯要严谨请修改完善《ASW_Basic分支分析_v1.5》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析的Matmul相关文件不要动那个文件夹
-------------------------------------------
ASW_Basic分支是BMM最重要的分支《ASW_Basic分支分析_v1.4》文档还需要继续完善,尤其是实现方案中的与源码的差异对比,例如
1、源码具体是如何确定BaseM\N的“再由 cubeBound 模型L2 供数能力 + 溢出惩罚 + K 向复用)枚举收缩” 这个具体是怎么做的?为什么源码要这么做,出于什么设计和考虑?和文档写的理论最优实现究竟哪个好?为什么?
2、SingleCoreM/N 源码是怎么做的?“源码用 cubeBound 模型 + balanceRate ≥ 0.9 剪枝,不解耦 SingleCoreM/N 与 BaseM/N” 具体怎么做的?为什么源码要这么做,出于什么设计和考虑?和文档写的理论最优实现究竟哪个好?为什么?
3、第五章后续其他 mCnt / nCnt 、尾轮问题,也都要详细对比,分析当前源码实现与文档的理论最优实现方案的优劣
多用公式推导分析清楚逻辑要连贯要严谨然后基于《ASW_Basic分支分析_v1.4》文档增量修改完善写出《ASW_Basic分支分析_v1.5》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析的Matmul相关文件不要动那个文件夹
-------------------------------------------
这个分析很重要,结合 IterBatch 的 case 特征看,“所以源码在 L0C 放不下时用 balance rate 做软门限(而非直接拒绝)是合理的:这批 case 天然偏写出 BoundL0C 串行的相对损失有限,主要风险在 batch 负载不均导致的尾端拖长——而这正是 ratio ≥ 0.8 所控制的。” 把这个道理详细解释下用公式推导分析清楚然后基于《MergeBatch_vs_IterBatch分析_v1.0》文档增量修改完善写出《MergeBatch_vs_IterBatch分析_v1.1》文档还是以markdown和html格式交付并同步到仓库注意仓库有其他人分析的Matmul相关文件不要动那个文件夹
-------------------------------------------
《ASW_Basic分支分析_v1.4》文档 还是有欠考虑的地方
1、在“五、实现方案”中目前的结论都是 SingleCoreM/N 、BaseM/N是正方形 感觉有问题,尤其是 要求 SingleCoreM/N 为正方形,如果 M=2048、N=512如果B不算太小在L1能放下的条件下SingleCoreN=512此时SingleCoreM=2048或1024肯定比SingleCoreM=512要好此时每Batch重复读更少了但此时 SingleCoreM/N就不是正方形了推导上到底是哪里出了问题
请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨请进一步修正完善《ASW_Basic分支分析_v1.4》文档还是以markdown和html格式交付并同步到仓库
-------------------------------------------
《ASW_Basic分支分析_v1.3》文档 还是有欠考虑的地方
1、在“五、实现方案”中“BaseM/N 的具体确定过程”为什么要BaseK≥ 128B/dtype最小高效粒度? 我们说的高效搬移是GM->L1不是L1->L0L1->L0只有满足Cube的计算粒度就行了是为了防止Cube计算利用率太低不是针对高效搬移的我再强调一下主要搬入瓶颈在GM->L1不是L1->L0这段可以被GM->L1或Cube计算掩盖
2、在“5.2 SingleCoreM / SingleCoreN 的确定”中SingleCoreM/N 的长宽比跟随 M/N 没说清楚理由,“跟随 M/N 使两侧搬移量均衡、避免一侧搬移过大成为 GM 带宽瓶颈” 这个对实际GM->L1搬入时延的减少到底如何提现请建模并公式推导说清楚理由也可以举例说明我需要判断下你的理由是否成立
请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于《ASW_Basic分支分析_v1.3》文档 请进一步修正完善《ASW_Basic分支分析_v1.4》文档还是以markdown和html格式交付并同步到仓库
-------------------------------------------
《ASW_Basic分支分析_v1.3》文档 还是有欠考虑的地方
1、关于 “五、实现方案” 中对于“BaseM/BaseN 的长宽比跟随 SingleCoreM/SingleCoreN进而跟随 M/N对齐 16 的倍数。长宽比跟随。。。”的说法存在质疑当前核内L1->L0的搬移效率是很高的目前没有建模L1->L0的搬入时间主要搬入时间在GM->L1上长宽比跟随是否有利于GM->L1的高效率搬移提升要重点分析下而且L0A和L0B大小相等如果使用长宽比跟随的切法L0A和L0B的容量的使用率就会存在明显差异基于上述分析长宽比跟随的切分方法还站得住脚吗请仔细分析下
请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨请进一步修正完善《ASW_Basic分支分析_v1.3》文档还是以markdown和html格式交付并同步到仓库
-------------------------------------------
《ASW_Basic分支分析_v1.2》文档 还是有欠考虑的地方
1、在 “5.2 SingleCoreM / SingleCoreN 的确定(每核输出 tile≥ BaseM/N”中如果M\N确定那么SingleCoreM/N 越小,总块数 mCnt×nCnt 越多,核间重复读会越多,此影响是否有分析?
2、 在“5.1 BaseM / BaseN 的确定”中说"“BaseM/BaseN 的长宽比跟随 SingleCoreM/SingleCoreN进而跟随 M/N对齐 16 的倍数”,这个是为什么?为什么长宽比要跟随?
请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于《ASW_Basic分支分析_v1.2》文档 请进一步修正完善《ASW_Basic分支分析_v1.3》文档还是以markdown和html格式交付并同步到仓库
-------------------------------------------
《ASW_Basic分支分析_v1.2》文档 还是有欠考虑的地方
1、关于其尾轮切分问题如果是算力Bound尤其是算力Bound特别严重时这时访存效率是次要因素了至少dValue可以放宽至128Bytetile_size至少也可以放宽一半吧尾轮也要把核都用满这样所有核才能都发挥出算力以求尽快算完
2、《ASW_Basic分支分析_v1.2》文档 整体的结构审视一下是否合理,是否需要调整,包括全文的逻辑连贯性、一致性,这个是期望当做独立文章发表的
-------------------------------------------
《ASW_Basic分支分析_v1.2》文档 ,不要引用 “v0.98...”,直接把 搬移效率 问题 在本文前面解释下,这是篇独立文章,只能引用有网上链接的公开网页内容,不能引用本地文件;而且你对 硬件最低要求 dValue ≥ 256B 这句话理解有误这个dValue是矩阵为ND数据排布是连续排布的列数据量(Byte)不会是K维度和N维度的乘积对于ND排布的右矩阵如果是非转置dValue最大就是N*dtype如果是转置dValue最大就是K*dtype
-------------------------------------------
《ASW_Basic分支分析_v1.2》文档 在 5.2 尾轮重切时说的 重切约束 是怎么来的?怎么跟 BMM算子优化分析_v0.98 文档中 搬移效率的要求感觉对不上呢?“*最优切分因子*:在不违反约束的前提下尽量让 r*s接近C”,这里的“约束”就是“重切约束”吗?
-------------------------------------------
《ASW_Basic分支分析_v1.1》文档还是有几个问题:
1、在 5.3 尾轮影响的量化 中 你提到 n_wave>=4 尾轮影响才小于25%这个25%已经是很大的影响了而2轮、3轮的case应该不在少数这些情况要如何提升性能呢要得是最优实现要算子总时延最短此时是否再进行尾轮切分要如何切分结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析给出最优实现的公式推导注意尾轮切分是在host(CPU)上做的,是算子启动前提前算好的从host下发给device(NPU)不占用NPU时间
2、在 六、实现方案 中也没有说清楚如何确定BaseM、N, singleCoreM、N是16的倍数遍历吗要结合尾轮处理一起描述具体实现过程另外和源码的差异是什么要讲清楚
请基于v1.1进一步修正完善生成《ASW_Basic分支分析_v1.2》文档并同步到仓库
-------------------------------------------
《ASW_Basic分支分析_v1.1》中的step0一定要让L0C开乒乓吗Ascend950PR芯片的fixpipe有unitflag功能如果打开可以没完成16*16*16的矩阵乘计算就立即写出这样是不是可以L0C不开double buffer就达到很好的性能BaseM/N也可以更大mCnt和nCnt会更小重复读会更少我把BMM源码拷贝到了/storage/Users/currentUser/OpenDesk/Matmul算子分析/.opendesk/matmul/batch_mat_mul_v3 你一定要比对源码分析结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨请进一步修正完善《ASW_Basic分支分析_v1.1》文档并同步到仓库
-------------------------------------------
《BMM算子优化分析_v0.98》文档的第八章是至关重要的一章把这一章单独领出来写成一篇文档当前《BMM算子优化分析_v0.98》文档的第八章还是有问题的,有欠考虑
1、你定义的mCnt和nCnt是一个Batch内的M、N维度切分个数是吗“约束 1——并行度下限总块数须填满 C 核。” 这个约束为什么写成mCnt*nCnt>=向上去整的C/B而不是B*mCnt*nCnt %C = 0
2、如果 B*mCnt*nCnt %C 不等于 0有余数那可能在处理多轮分块后存在尾轮问题那尾轮需要重新切分把核用满吗还是尾轮和之前轮的SingleCoreM、SingleCoreN、BaseM、BaseN一样如果尾轮单独切分应该怎么切分
请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于《BMM算子优化分析_v0.98》文档的第八章把ASW_Basic这个兜底分支单独好好写一篇理论最优方案的实现分析还是以markdown和html格式交付最后要同步到gitea仓库上去
-------------------------------------------
《BMM算子优化分析_v0.97》文档的第八章是至关重要的一章大量BMM的case都在这一章一定要把最优实现的具体方案分析的非常透彻清楚为什么先按B分组再切M、N不优是任何情况都不优吗L2容量能放下读写数据也不优吗先有时延建模然后最优方案的一步步做法要有清晰的逻辑推导可以分场景不同情况讨论每一步要确实可实现多用公式描述公式里涉及的变量和维度一定要标注清楚请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于v0.97修改完善生成v0.98还是以markdown和html格式交付最后要同步到gitea仓库上去
------------------------------------------
《BMM算子优化分析_v0.96》文档的第八章没有说明清楚具体如何按 B→M→N 优先级分配到 C 核我的初步想法是先按B分组例如4个B那就8个核一组组内再切MN这样重复读只会发生在这8个核这样会不会更好但是也存在B不能被核数整除的情况应该怎么办如果不是按B先分组那具体应该如何按 B→M→N 优先级分配到 C 核呢请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨基于v0.96增量修改完善生成v0.97还是以markdown和html格式交付最后要同步到gitea仓库上去
------------------------------------------
《BMM算子优化分析_v0.96》文档的第八章怎么没有有些内容缺失了、有些内容和第七章混到一起了啊改进修正另外第八章ASW_Basic的具体实现方案要好好梳理清晰结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析注意描述逻辑一定要连贯、要严谨最后要同步到gitea仓库上去
-----------------------------------------
将MergeBatch和IterBatch的各自理论最优实现、对比分析、适用分界、各自与源码对比抽出来新整理成一篇文档如果涉及文章或源码引用必须使用官网链接不能引用本机文件夹或文件
-----------------------------------------
《BMM算子优化分析_v0.95》文档的MergeBatch的理论最优实现的思路可能有点问题应该是
1基于L0C容量约束、算存比约束确定最大合并数b或者叫b0
2基于b0和L0A、L0B确定kL0
3令bL1_=b0基于L1容量求kL1_ 进而kL1=min(kL1_, K, 512B)
4基于kL1和L1容量确定bL1力求bL1尽量大
请基于上述建议基于v0.95文档修改MergeBatch分支中相关章节和描述升级到v0.96注意描述逻辑一定要连贯、要严谨最后要同步到gitea仓库上去
-----------------------------------------
升级一下《BMM理论vs源码对比分析_v1.0》文档,重点对比分析下 ASW_Basic 分支的理论最优实现和源码实现的差异升级到v1.1v1.0也要保留不要删除理论最优实现参考《BMM算子优化分析_v0.95》,源码实现参考/storage/Users/currentUser/WorkBuddy/昇腾NPU/昇腾NPU知识库/代码仓/ops-nn/matmul/batch_mat_mul_v3 中的对应源码实现
-----------------------------------------
BMM算子优化分析_v0.95的文档中 ASW_Basic 分支还需要优化:
1、在实现方案Step0中描述的baseK*dtype>=256Byte,这个在L1->L0搬移时并不是必要条件第二章的搬移效率主要是GM->L1的dValue要求应该是每次GM->L1的那个K维度的数值kL1*dtype>=256Byte实际上如果核间不切KK=singleCoreK>=kL1>=BaseK
请基于上述建议修改v0.95文档ASW_Basic 分支中相关章节和描述注意描述逻辑一定要连贯、要严谨最后要同步到gitea仓库上去
-----------------------------------------
BMM算子优化分析_v0.94的文档中还是有一些需要优化
1、ASW_Basic 分支 的 实现方案 的Step0没有考虑SingleCoreM>=BaseM, SingleCoreN>=BaseN而且BaseM、BaseN要受制于L0的约束BaseM、BaseN要尽量把L0C用满要把整个ASW_Basic 分支作为整体考虑最优的tiling和swizzle方案的实现可以分场景描述请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析
2、在MergeBatch 分支 中的 “MergeBatch vs IterBatch 分界建模” 中对比T_Iter和T_Merge时只考虑了 K 截断情形n_k=1那对于kL1<K呢n_k>1呢这时的分界条件是什么缺乏有逻辑的分析请补充完善分析
请基于v0.94文档增量撰写修改优化v0.95文档还是以markdown和html格式交付注意逻辑一定要连贯、要严谨最后要同步到gitea仓库上去
-----------------------------------------
BMM算子优化分析_v0.94的文档中 ASW_Basic 分支 还是没讲清楚你为什么直接用L0去约束SingleCoreM、SingleCoreN这样合适吗在TCubeTiling结构体成员变量概念里面BaseM、BaseN会直接受制于L0的容量约束但是SingleCoreM、SingleCoreN并不是受制于L0SingleCoreM、SingleCoreN更重要的是影响量GM->L1的搬移效率和重复读数据量要把整个ASW_Basic 分支作为整体考虑最优的tiling和swizzle方案的实现可以分场景描述请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析请基于上述建议修改v0.94文档ASW_Basic 分支中相关章节和描述注意描述逻辑一定要连贯、要严谨最后要同步到gitea仓库上去
-----------------------------------------
BMM算子优化分析_v0.94的文档中 ASW_Basic 分支 还是没讲清楚啊具体实现怎么做啊SingleCoreM、SingleCoreN怎么确定啊请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析请基于上述建议修改v0.94文档ASW_Basic 分支中相关章节和描述注意描述逻辑一定要连贯、要严谨最后要同步到gitea仓库上去
-----------------------------------------
BMM算子优化分析_v0.94的文档中 ASW_Basic 分支 的 L2切分讲的不好尤其是 场景 C没有讲清楚 当S_in>L2容量时还是不要基于mL2、nL2这样的概念来描述这个概念理解会有偏差我默认会把mL2理解成L2中的M维度上的切分长度而且不是切分块数L2主要是cache不能完全当buffer用软件可控粒度比较粗可以定义输入tensor从GM读的时候驻留L2输出tensor写到L2描述时还是基于 TCubeTiling结构体 中的概念来组织语言描述L2上要放多少SingleCoreM、SingleCoreN这些SingleCoreM、SingleCoreN组成的分块要如何swizzle请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析请基于上述建议修改v0.94文档ASW_Basic 分支中相关章节和描述注意描述逻辑一定要连贯、要严谨最后要同步到gitea仓库上去
----------------------------------------
BMM算子优化分析_v0.93的文档中 ASW_Basic 分支 的 L2切分讲的不够清楚尤其是 场景 C 当S_in>L2容量时mL2,nL2应该怎么确定mL2,nL2和mL1, nL1是不是应该相等请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析补充给出ASW_Basic分支的最优tiling和swizzle方案基于v0.93增量完善生成v0.94还是以markdown和html格式交付注意逻辑一定要连贯、要严谨最后要同步到gitea仓库上去
----------------------------------------
现在需要新写一篇文档,对比下 《BMM算子优化分析_v0.93》文档的理论最优实现方案分析和 在“/storage/Users/currentUser/WorkBuddy/昇腾NPU/昇腾NPU知识库/代码仓/ops-nn/matmul/batch_mat_mul_v3” 算子的当前源码实现每个分支逐一对比各分支条件及其tling&swizzle实现、以及如何修改源码来实现理论最优方案每个分支的对比都要总结分析下差异和优劣理论分析的最优方案究竟是不是最优当前源码的实现原理又是什么源码是否是合适的还是以markdown和html格式交付注意逻辑一定要连贯、要严谨最后要同步到gitea仓库上去
----------------------------------------
BMM算子优化分析_v0.92的文档中 的 “MergeBatch vs IterBatch 分界” 里面有些理解有问题
1、对于T_iter和T_merge的建模由于L0C是开了double buffer的因此fixpipe和cube之间就没有额外的同步开销T_bd应该不存在
2、MergeBatch的实现核心是多个Batch Merge一起搬移GM->L1而不仅是多个Batch Merge一起计算同样的IterBatch是逐个Batch的搬移和计算这个点是MergeBatch和IterBatch的核心差异
请基于以上两点修改并结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析核心目标是找清楚MergeBatch和IterBatch的适用条件边界并论述清楚证据要确凿逻辑要严谨请基于v0.92文档修改优化撰写v0.93文档还是以markdown和html格式交付注意逻辑一定要连贯、要严谨最后要同步到gitea仓库上去
----------------------------------------
BMM算子优化分析_v0.91的文档中 的 StreamK 分支
1、进入分支条件的P是不是应该<=C/2 ?
2、gridK是不是就等于 C/P ? 这个girdK应该如何取值要说明清楚
3、在 “K 闭式阈值推导” 时 说 “ $M^t N^t/(M^t+N^t)$ ~ O(100)” 这是为什么?如何得到的,要解释下
请基于v0.91文档修改优化撰写v0.92文档还是以markdown和html格式交付注意逻辑一定要连贯、要严谨最后要同步到gitea仓库上去
----------------------------------------
BMM算子优化分析_v0.91的文档中 “MergeBatch vs IterBatch 分界”里面还需要优化调整一下,
1、请把一阶二阶建模合一起描述先讲下建模方法原理再一起写公式不要分一阶二阶分开写
2、对于分界条件penalty对应的两个式子需要分别解释下什么叫“L1绑定”什么叫“K截断”跟前面的推导又有什么关系
3、在证据来源里面你在“同步指令是高开销指令”中引用了“CANN社区版9.2.0-beta.1/01_AscendC算子开发/260_..._SIMT算子性能优化.md”文的这个文档应该是讲AIV核的BMM算子执行在MergeBatch和IterBatch的时候没有用到AIV核吧源码有证据用到AIV核了吗
请优化调整 BMM算子优化分析_v0.91的文档
---------------------------------------
在“/storage/Users/currentUser/WorkBuddy/昇腾NPU/昇腾NPU知识库/代码仓/ops-nn/matmul/batch_mat_mul_v3” 算子的MergeBatch和IterBatch的kernel侧源码中是否有硬件间的Set\Wait操作能否从这个角度分析T_bd存在的原因请结合NPU知识库的其他资料说明
---------------------------------------
源码用 MIN_BATCH_L0=4也不是代表开了4buffer只是L0里一次放4batch我早就说了源码未必最优这个仅供参考我现在是让你找“T_bd的物理成因能否在 NPU资料库中找到对应证据尤其要在 “昇腾950_NPU架构白皮书.pdf”和“/storage/Users/currentUser/WorkBuddy/昇腾NPU/昇腾NPU知识库/CANN社区版9.2.0-beta.1/01_AscendC算子开发”里面找
---------------------------------------
BMM算子优化分析_v0.91的文档中 MergeBatch vs IterBatch 分界中说到的 “每 batch 边界有固定开销”这个固定开销是什么为什么有这个固定开销要解释下分析后要总结下MergeBatch相对于IterBatch的优势是什么
---------------------------------------
BMM算子优化分析_v0.91的文档中 MergeBatch vs IterBatch 分界建模 中有些概念还是交代的不清楚
1、一阶流水模型 中的分块是什么概念什么维度BMKN分别怎么切要介绍下对应的后续公式中提到的符号都要介绍下
2、MergeBatch的条件2到条件5去推导条件1的分析过程没有看到
请你请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析尽量多用公式推导细化 MergeBatch vs IterBatch 分界建模 的分析过程核心目标是找清楚MergeBatch和IterBatch的适用条件边界进一步完善BMM算子优化分析_v0.91的文档
--------------------------------------
既然你说一阶流水模型下MergeBatch 始终不优于 IterBatch那就说明一阶流水模型找不到MergeBatch和IterBatch的适用分界条件那你能不能通过建模二阶模型进一步分析以明确找清楚MergeBatch与IterBatch的分界条件如果MN较小时MergeBatch多batch一起做可以把L0C用满IterBatch此时就用不满这会让MergeBatch在某些条件下取得优势吗当B很大时MergeBatch会先以b0为粒度进行乒乓流水只有最后一个b0才可能进一步切K做double buffer乒乓流水另外我在补充下在无业务实测搬移效率时还发现数据量越大搬移效率越高即单核搬移数据总量越大、单块数据量越大搬移效率会越高大数据块连续搬移比离散搬移效率高请你请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析尽量多用公式推导核心目标是找清楚MergeBatch和IterBatch的适用条件边界
基于v0.9增量写v0.91文档还是以markdown和html格式交付注意逻辑一定要连贯、要严谨最后要同步到gitea仓库上去
-------------------------------------
BMM算子优化分析_v0.9的文档中有个问题需要解答:
是关于MergeBatch和IterBatch的适用边界问题MergeBatch好像都能用IterBatch来做具体什么条件MergeBatch才相对IterBatch更有优势呢
我初步感觉是如果是每Batch都是计算Bound那肯定用IterBatch因为MergeBatch会浪费算力IterBatch不会此时IterBatch时延更短。在访存Bound时MergeBatch和IterBatch都是 先搬移数据时延+最后一小段不可掩盖的计算时延+最后一小段不可掩盖的搬出时延如果B较小用MergeBatch做最后一个b0的时候只能切K来乒乓最后一段kL0的计算时延无法被掩盖由于MergeBatch的实现天然会浪费算力和计算时延会更多此时如果用IterBatch来做虽然最后kL0的计算时延也无法被掩盖但是IterBatch的做法不会浪费算力同样维度计算下计算时延会更小这使得IterBatch总时延会更短而且由于B较小最后不可掩盖的计算时延不可忽略这段不可掩盖的计算时延在总时延中的占比会更高如果B较大MergeBatch和IterBatch也都是 先搬移数据时延+最后一小段不可掩盖的计算时延+最后一小段不可掩盖的搬出时延但是此时最后不可掩盖的计算时延占比会较低这段不可掩盖的计算时延在总时延中的占比会更低前面的数据搬移时延占比会更高MergeBatch在大B情况下可以切K然后多个B一起搬移带宽搬移效率会更高关于带宽搬移效率分析结论参考第二章
例如尝试把问题具象一些MergeBatch的分支条件2~5是相对明确的但是条件1不一定对缺少清晰的推理或证明尽量多用公式推导假设输入的BMM的shape和dtype(16bit)是确定的请你请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析先用公式和逻辑建模MergeBatch分支做的算子端到端时延t1也建模IterBatch分支来做的时延t2看看在满足MergeBatch的条件2~5的前提下能否推导出条件1或类似条件1的结论
核心目标是找清楚MergeBatch和IterBatch的适用条件边界
-------------------------------------
在 BMM算子优化分析_v0.9的文档中对于StreamK分支的“归约代价可接受”中和T_SK对比的T_PIPE=max(T_MTE2, T_MMAD)这里T_MMAD=2MKN/Q_16为什么直接就按单Batch的M、K、N维度来估算计算时延以及随后的访存时延如果不切K只切B、M、N到每个核都是做1Batch吗这里缺少了降核ASW的芯片级维度到核级维度的说明应该是芯片级时延 T_SK < T_PIPE请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析修改v0.9文档增加字数一定不要太多不要加一堆不痛不痒的描述解释用公式清晰表达逻辑关系内容要精且清晰还是以markdown和html格式交付注意逻辑一定要连贯、要严谨最后要同步到gitea仓库上去
--------------------------------------
BMM算子优化分析_v0.9的文档中 MergeBatch中新增的 b_core=2的解释 中说“但 MergeBatch 引入了 50% 冗余算力——一旦 tile 内 K 段过短导致计算暴露,性能退化”这句不理解,请稍微展开解释下
--------------------------------------
BMM算子优化分析_v0.8的文档中还有一些需要优化的
1、streamK分支的进入分支条件的第3点直接放在进入分支条件汇总里面是不是不合适毕竟T_pipe也是无法预设的汇总的条件要直接基于caseB、M、K、N和dtype和芯片规格参数能直接判断具体原理推导和公式放到逐条解释说明里streamK分支的进入分支条件的第3点的逐条解释的推导也看不懂K的闭式阈值是怎么推导的为什么访存Bound的阈值更低请补充详细公式列出推导过程并说明理由
2、对于MergeBatch的进入分支条件的第一个条件有人挑战说b_core=2即b0也可以进行MergeBatch为什么一定要乒乓,我之前初步认为如果b_core=2按IterBatch做乒乓有一定流水掩盖时延会比MergeBatch好但是如果MN较小在b_core=2时到底是MergeBatch好还是IterBatch好请补充分析下加在MergeBatch分支章节里面
请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析基于v0.8增量写v0.9文档增加字数一定不要太多不要加一堆不痛不痒的描述解释内容要精且清晰还是以markdown和html格式交付注意逻辑一定要连贯、要严谨最后要同步到gitea仓库上去
----------------------------------
BMM算子优化分析_v0.8的文档中的StreamK分支进入条件解释的合理性还需要仔细审视在“归约代价可接受”中的公式中描述的Q16Q_AIV都是什么意思θ_c=11是如何具体计算出来的以及随后的“工程约束”的解释就更粗糙了怎么就得到源码中的8192是为了摊薄固定开销逻辑是原理什么请结合NPU架构和BMM算子执行数据流过程、逻辑合理性仔细审视分析并修改完善v0.8文档最后要同步到gitea仓库上去
---------------------------------
BMM算子优化分析_v0.7的文档中的StreamK分支里面在进入分支条件中解释归约代价可接受时说Tmmad>α*Treduce,α=10才能保障流水不改变瓶颈归属为啥是α=10为啥不是α=1而且也没有跟读入时延比较这样合理吗请结合NPU架构和BMM算子执行数据流过程仔细审视分析分析结果如果影响文档中其他地方也需要修改如果改动较大请基于 BMM算子优化分析_v0.7文档 改造到v0.8字数一定不要多不要加一堆不痛不痒的描述解释内容要精且清晰还是以markdown和html格式交付注意逻辑一定要连贯、要严谨
------------------------------
BMM算子优化分析_v0.6文档 还有一些问题:
1、文档中不要说 “基于 issue#3 扩展。”
2、芯片算存比的计算R16为什么是 486*2/1.6这个2是啥不需要这个2因为486这个标称算力已经是包含乘和加2次运算后的了包括后续涉及的对应计算逻辑都要对应修正
3、IterBatch 分支 的进入条件3.c和3.d我没有想清楚是不是合并成3.c一条就行了只把现在3.c的b_per_core=1改成b_per_core>=1请仔细帮忙审视下是否合理3.d原本是想说对于某些每核分到的batch有2个或以上但是L1又放不下一整个batch的左右矩阵应该符合什么条件才适合流水掩盖请帮忙仔细考虑清楚并进行必要修正及补充
4、对于 StreamK 分支 的第三个进入条件还是不理解请一步步按实现流程解读清楚在解释中说到的Treduce主要包含的时延应该是gridK次的读回+AIV的求和+最终结果写回的时延而且gridK的中间结果也可以占用L2内存使用L2的读带宽读回AIV核累加AIV是独立硬件芯片架构上数据流是GM/L2->UB memory->AIV->UB memory->L2/GM这里的UB memory是AIV核的核内内存用于承载AIV核的输入输出相关芯片架构规格可参考/storage/Users/currentUser/WorkBuddy/昇腾NPU/昇腾NPU知识库
5、在ASW_Basic 分支的L2 切分中介绍的分场景决策的场景 B 中说到,“输入驻留、输出直写 GM”、“保住r_in=1”这个r_in=1是什么意思为什么就决定“输入驻留、输出直写 GM”“输入驻留、输出直写 GM”、“保住r_in=1”的好处是啥推导逻辑又是啥论述上都有缺失请把理由描述清楚ASW_Basic 分支的L2 切分要首先介绍下是切什么?你说到“块内分配用错位分核(对角线分配)”这块的描述不好理解,能举例并有简单图示配合说明下吗?
基于 BMM算子优化分析_v0.6文档 改造到v0.7字数一定不要多不要加一堆不痛不痒的描述解释内容要精且清晰还是以markdown和html格式交付注意逻辑一定要连贯、要严谨
------------------------------
BMM算子优化分析_v0.6文档还是需要修改优化下,
1、关于ASW_BASIC的实现方案的swizzleASW 滑窗蛇形章节举例说明的窗口内没有提现出蛇形在窗口0的第3块是μ3,ν0如果窗口内也是蛇形的话第4块应该是μ3,ν1而不是μ0,ν1窗口内是不是也很有必要蛇形如果是请解释并修改对应章节
2、关于ASW_BASIC的实现方案的L2 切分(工作集超 L2 时这个场景描述还是很不细致逻辑原理也没有说清楚也没有考虑写出也是会占用L2空间的情况写出占用L2的话便会压缩L2用于读入数据的空间如果写出不占用L2的话直接写出到GM此时会不会进入fixpipe写出Bound可能要分场景分别分析注意借助公式描述清楚核心逻辑原理找到最优实现方案并适当举例说明
请基于上述建议修改v0.6文档字数一定不要多不要加一堆不痛不痒的描述解释内容要精且清晰还是以markdown和html格式交付注意逻辑一定要连贯、要严谨
-----------------------------
针对《BMM算子优化分析_v0.5》文档,发现一些问题需要改进,
1、在 符号与芯片参数约定 的表格中min_TileSize的含义是 确保高带宽利用率的单块搬移数据量最小值min_DatamountPerCore的含义是 确保高带宽利用率的单核搬移数据量最小值minCoreNum 是确保高带宽利用率的并行搬移核数的最小值还有一个概念dValue 含义是单数据块内数据连续排布数据长度推进256Byte或512Byte不建议小于128Byte以上数值是基于Ascend950PR芯片实测分析总结其重要性核数>单核搬移总数据量>单分块大小>dValue大小不同NPU芯片数值可能略有差异文档后续其他描述也要对应审视是否需要调整
2、在 符号与芯片参数约定 的表格中R 含义现在写的是 芯片算存比平衡点BF16/FP16与专业语境不太相符我们一般叫 算存比 或对应位宽算存比, 文档中可以对应就叫 对应位宽算存比如果是16bit位宽就用R然后下标16表示文档后续其他描述也要对应审视是否需要调整
3、在 符号与芯片参数约定 的表格中k_thr本意是为了限制进入StreamK分支的最小K值在batch_mat_mul_v3源码昇腾NPU知识库/代码仓/ops-nn/matmul/batch_mat_mul_v3中是AicNum*2048/dtype为什么是这个数我没搞清楚可能是个经验值你可以帮忙分析下补充到StreamK分支中去文档后续其他描述也要对应审视是否需要调整
4、在讲到 实现本质逻辑 时有个表格,其中,切分维度中的 切B 的 读入特征 “每个数据块只被固定的 1 个核读取核间零重复读”这个说法没错但可以补充下若核内读取每个Batch时单核GM->L1时是切分了M或N再分块完成后续计算核内也可能存在重复读包括后面 按切分特征分组 的表格里面切B的共同特征“零重复读读写数据量固定” 这个表述也是不准确的,是有条件的,需要对应完善,要进行严谨的描述,配套的其他位置也要对应严谨考虑后修改描述
5、在MergeBatch分支的进入分支条件中说 “b0 为单次合并数下限” 可能不够严谨,应该是 “b0 为单次合并计算的batch数下限”在单核搬移总量的约束中不应该直接写480KB应该写min_DatamountPerCore毕竟约束条件是可以跨芯片有一定泛化性的但是480KB的数值是基于Ascend950PR芯片的实测类似的下面 搬移 tile 大小 的 16KB应该改为min_TileSize在 访存 Bound算力浪费可被掩盖的描述中“合并把单次计算的算存比放大 b0 倍后仍须低于芯片平衡点 R”,应该是低于对应位宽算存比
6、在 IterBatch 分支 的进入条件 L1 容量约束 中说 “只要 L1 放不下单核要处理的完整输入M、N 维度的 A/B 数据),就会产生跨 batch 的重复读” 这个表述不准确吧单核逐个batch处理为什么会产生跨batch重复读呢我认为应该是 如果L1放不下完整维度的M、NkL1可以小于K,即K维度可切分段放入L1在计算单Batch时就会产生重复读
7、IterBatch 分支 的 “d) 多 batch 时 (c) 的乒乓版本容量预算减半我看你只是机械的列出了我原来issue3中的条件没有任何解释说明可能你不知道如何解释这个条件我之前的考虑可能也不成熟这个条件我之前的想法是如果平均每核要处理多个batch而L1又无法放下1Batch的左右矩阵那如何乒乓流水呢尤其是单核的多个Batch间如何乒乓流水呢一个思路是还是按Batch乒乓每个batch只固定预留L1/2的空间和L0C/2单个Batch的单核计算只切K或者 全载1个切另一个的非K维度这样单核的Batch间也可以算上一个batch的同时搬入下一个batch这只是我的初步想法可能不够成熟你也好好想想逻辑上有没有漏洞目标还是为了搬移读入和计算流水掩盖fixpipe搬出有unitflag开启unitflag后每算完16x16x16就会硬件自动搬出所以可以认为搬出的流水是硬件自动完成了但是单核batch间的读入和计算如何掩盖尤其是上一个batch在做最后一个分块时下一个batch能搬入吗搬入什么样的分块上一个batch的计算能不能不要产生气泡注意此时搬移效率也必须要高。还是说条件(c)和(d)其实可以合并就可以很好的流水掩盖了这个点我没想清楚请帮我从硬件流水实现角度仔细考虑完善考虑清楚后也需要对应适当完善IterBatch的实现部分
8、StreamK 分支 的进入条件的第一个 “并行缺口存在B/M/N 用尽仍填不满核)” 这个初衷是没问题但是一般M、N的切分不可能就切到Cube分型的16那样搬移效率和L0C利用率都太低了为了图省事往往会粗拍BaseM=256、BaseN=256但是我们考虑最优实现就不合适只定256了我想P=B*(M*N*L0C_ElementDtype)/L0C_Size来作为不切K的最大并行度估计可能是合适的免去了要先去估计一个M、N的切分以L0C最大利用率来估计如果不切K的并行度你说呢进入条件的第二点K足够长的思路也没问题但是如何清晰的量化和充分的理由要仔细考虑K/gridK>=256这个256是什么含义呢是指影响带宽效率的推进dValue的256Byte吗对于这个“K 足够长归约代价可接受”的第二式的解释也可以再详细些引出安全系数的公式是怎么来的安全系数α为什么要10θ为什么是1.7*10^3?源码中StreamK分支的K好像是要求大于2048*AicNum/dtype有分析下为什么吗请结合硬件架构和规格仔细考虑分析下另外对这个第二式解释的Markdown格式的渲染有问题
9、对于每个分支的 进入分支条件你先集中汇总一下汇总的条件不要解释直接一个个列出各个条件每个条件应该只有B\M\K\N和芯片规格参数的关系约束汇总完后再逐条解释
10、再增加一个章节遍历BMM 的 case看看都落在哪个分支遍历的范围是 B1~2048、M1~10240、K1~10240、N1~10240看看按当前的进入条件这些case分别都落在哪个分支
请基于上述建议重新生成v0.6文档字数一定不要多不要加一堆不痛不痒的描述解释内容要精且清晰还是以markdown和html格式交付注意逻辑一定要连贯、要严谨另外请稍微整理下仓库文件将v0.4、v0.5、v0.6放到同一个文件夹下文件夹名可以叫“BMM算子优化分析_Release”
--------------------------------------
《BMM最优软件实现方案设计.md》的第六章给出了BMM最优性能的4大分支《BMM分块计算数学公式.html》从公式原理角度给出了分块计算的定义但是这两个之间还差一层逻辑就是如何从分块计算+最优实现推导出需要这4大分支呢请帮我好好思考分析这个问题另外《BatchMatMulV3算子分支实现分析.html》里面有当前BMM算子实现的分析供参考
-------------------------------------
需要补充修正一下在问题定义里说的BMM 的语义是元素级运算这个写的很好很清楚但是我们在NPU上是使用Cube核进行分块矩阵乘的计算请再补充一个分块矩阵乘的公式及其说明注意4个维度都可以切直接补充到《BMM分块计算数学公式.html》、《BMM分块计算数学公式.md》这两个文件里去
--------------------------------------
BMM分块计算的本质用数学公式要如何表示注意4个维度都可以切你直接输出的公式都是没有渲染的生成格式规范的markdown文档和html文件输出到本地吧
-------------------------------------
《BatchMatMulV3算子分支实现分析.html》文件的第五章逐分支详解的描述不够清晰、不够细致也没有为什么这么做为什么设置这个参数这个参数为什么是这个值的分析请把第五章好好完善首先要要把代码实现过程清晰的描述出来可以配套画一些流程图或架构图每个分支都要清晰的、详细的描述条件、实现过程、步骤并进行必要分析为什么这么做注意参考NPU知识库中的其他资料或者上网搜集其他资料辅助分析
------------------------------------
详细分析下NPU知识库中ops-nn/matmul/batch_mat_mul_v3的算子代码实现为了高性能的实现BMM算子的所有case当前BMM算子有哪些分支为什么是这些分支这些分支具体是怎么实现的形成html格式的分析说明文档输出到本地可以参考NPU知识库中的其他资料或者上网搜集其他资料辅助分析
tips1算子软件实现方案设计主要是结合芯片微架构特征和规格设计分块到各个AiC核上的搬移、计算的tiling和swizzle(所谓swizzle简单说就是分块执行的顺序以及哪个分块在哪个核上做)
--------------------------------
分析还是有漏洞,不够细致
1、在6.2的排除规则1中你说“核间再切 B/M/N 不会增加并行度,只会减少每核的 K 范围”这句话不理解当一个case输入后case本身的B\M\K\N是固定的只切K分到所有核和切K又切另外维度分到所有核相比显然前者的K会切的更小后者的K会切的更大对应的K的范围会更大才对吧怎么会“只会减少每核的 K 范围”呢例如case的B=4,K=4096如果只切K每核分得B=4K=4096/32=128如果切K又切B每核分的B=1K=512K变大了啊中间矩阵写出的次数更少了吧此时Reduce开销会比只切K时更多吗
注意在做本项目时,在分析思考时,如果有不确定的信息或困惑要多参考知识库(/storage/Users/currentUser/WorkBuddy/昇腾NPU/昇腾NPU知识库)的资料,或者从网上查询,不要局限于当前编辑的文档本身;
请进一步完善第六章
--------------------------------
分析还是不仔细不完备漏洞很多,还是重点先修改第六章的内容:
1、转普通Matmul还叫TO_MUL分支合适吗当前算子源码中TO_MUL是针对K==1且只用AIV去计算跟转普通Matmul意义差别很大转普通Matmul后只是没有B维度了如何做最优实现是另一大问题只是不在当前BMM算子下研究这个分支是将BMM的case中的某一类问题通过转换的方式借助Matmul的分析优化成果站在Matmul优化的巨人肩膀上高效实现BMM的caseBMM算子优化分析只关注相对Matmul差异化的case的最优实现
2、在第6.1章节对于分支完备性的分析还有很多欠考虑的地方ASW_Basic不只是B=1吧B较小时是不是都可以cover甚至B较大时单Batch的输出MN超过L0C的大小此时ASW_Basic核间切B\M\N的性能和IterBatch核间切B核内可切M\K\N的性能究竟哪个好要如何分辨呢
3、在第6.1章节,你说“不存在第六种独立分支——例如"同时切 K 和 M/N"是 StreamK 与 ASW_Basic 的组合,但可归入 StreamK核间切 K 后,核内自然切 M/N从完备性角度是可能存在核间同时切 K 和 M/N的从性能最优角度也可以考虑排除一些分支但为什么排除掉这个分支需要有充分理由说明当完备性角度考虑的某个分支明确明显不如性能最优角度的候选分支才可以完全排除性能最优角度列出的分支应该是完备性角度分支的子集应该是性能最优角度的全集即任何case若想达到最优性能必然要按性能最优角度的某个分支中的实现方案实现如果某些case可以在完备性的某个分支中可达到性能最优则不能排除该分支你定义的StreamK分支是严格限制只切K吗核间完全不切B\M\N那这个分支要要求K必须很大K多大合适进入StreamK分支
-----------------------------
问题还是很多,没有细致考虑数据块在硬件上流转实现的细节,还是重点先修改第六章的内容;
1、按我的设想还应该有个可转普通Matmul的分支即当左矩阵或者右矩阵中有一个的B=1即BatchA=1或BatchB=1则可以把另一个B合并到非K的维度上例如左矩阵的BatchA=1此时可以将矩阵变为[M,K]@[K,BatchB*N]这样的二维矩阵相乘只是输出后要做一个按Batch的split从而转换普通Matmul的软件实现
2、请先从系统角度分析下为什么是这几个分支这些分支可以把所有BMM的case都覆盖全面还有没有其他分支的可能理由要充分和逻辑要清晰
3、第6.3 MergeBatch 不是每次计算都“将单核负责的 全部B_core 个 batch 的 A 矩阵沿 M 维拼接为 [B_core×M, K]、B 矩阵沿 N 维拼接为 [K, B_core×N],调用一次 Matmul 得到 [B_core×M, B_core×N] 的等效大矩阵”假设单核分到B_core 个 batch Cube->L0C 单次计算时可以只进行b个batchb<=B_core假设L1上放的Batch是bL1L0上放的是bL0单次实际计算的Batch数是b那么b<=bL0<=bL1<=B_core而且核内计算和搬移时是可以切K的切K后进行[bM,kL0]@[kL0,bN]=[bM,bN]多个K可以在L0C上直接累加得到最终的[bM,bN]再取BlockTrace从L0C搬移输出到L2或GM
先基于我上面的提示,进一步完善第六章内容
----------------------------
补充几点:
1、当前文档有很多描述很不专业本机有一些昇腾NPU软硬件知识库可参考路径是 /storage/Users/currentUser/WorkBuddy/昇腾NPU/昇腾NPU知识库
2、数据可以直接从GM读取到L1(GM带宽)在L2是cache配置时会随路驻留在L2同样的数据下次AIC再需要用的时候如果L2 cache中有就可以命中并以L2的速率读取L0C可以直接写出到L2也可以直接写出到GM注意L2容量有限而且可能读写数据都会占用L2容量如果L2容量被占满了再从GM来读入或从L0C写出新数据时L2 cache的内容会发生替换L2腾空间有两个办法一是对于L2已有的L0C写出的数据要先写回GM(写GM带宽)才能腾出空间二是对之前从GM读入的在L2 cache的数据进行替换以腾出空间在L2容量足够的情况下一般只会从GM读一次数据块的重复读取会发生在从L2读取因此L1容量大小会直接影响重复读的数据量和性能
3、从GM读取数据时存在访存效率问题影响访存效率的主要有几个因素重要性依次递减一是参与核数GM带宽所有核共享并发读取才能尽量充分利用带宽至少要3/4的核并发才能达到90%以上的带宽利用率二是单核读取的数据量越大越能达到高带宽利用率三是单次搬移的数据块越大越能达到高带宽利用率四是ND2NZ指令的dValue要128Byte最好是256Byte或512Byte(例如在GM以ND排布的非转置左矩阵的K维度、非转置右矩阵的N维度上所搬移的数据量对应单次搬移的dValue)
4、BMM算子当前主要是MergeBatch、IterBatch、StreamK、ASW_Basic这几个软件实现分支
5、关于tiling和swizzle的描述可以参考当前算子结构体中的描述MatmulConfig参数说明L0C的大小影响M、N的切分
6、给定具体case要能给出最优软件实现方案并能评估端到端算子时延给定具体case并给定具体tiling和swizzle方案也要能评估端到端算子时延
另外单独补充说明下MergeBatch、IterBatch、StreamK、ASW_Basic这几个软件实现分支可参考ops-nn/matmul/batch_mat_mul_v3算子源码我要强调的是源码未必是最优的要以批判的眼光审视源码参考并优化方案
1、其中MergeBatch和IterBatch都是先按Batch分核核内计算时MergeBatch会进行[bM,K]@[K,bN]的计算,然后按[M,N]的Block取Trace会存在算力浪费不过一般访存Bound计算时延可以被掩盖浪费一点也没关系IterBatch在核内计算时就是逐个Batch的进行计算
2、StreamK是在B、M、N切分无法有效利用核数并行计算时通过切K达到多核有效计算提升核负载利用率的目的但存在核间的Reduce的额外开销
3、实践中大多数case会走ASW_Basic分支该分支不切K对于B、M、N都可以切
请参考我的补充说明重新审视并优化《BMM最优软件实现方案设计.md》
-------------------------
我想设计BMM算子在NPU(昇腾950PR)上的最优软件实现算子接口大致与batch_mat_mul_v3类似目标是任何shape、dtype的BMM case来了都能得到最优的软件实现方案所谓最优就是最终可以达成在该芯片上最短的端到端算子时延你先拿出个设计方案输出到本地要有理有据下面有一些tips供参考
tips1算子软件实现方案设计主要是结合芯片微架构特征和规格设计分块到各个AiC核上的搬移、计算的tiling和swizzle(所谓swizzle简单说就是分块执行的顺序以及哪个分块在哪个核上做)
tips2据我了解GM带宽1.6TB/s是读写共享L2的带宽5.2TB/s是读写各自独享Cube计算的输出是可以直接写到L2的所有最终输出都写到L2也算计算完成。
tips3关于核间切分的一些想法如下
核间切分
切B
读入
每个数据块都有对应的核且每个数据块只会被固定的1个核读取
每核独立读取各自的多个数据块,不会读取其他核的数据块
计算
每个最终结果数据块由每个核独立计算产生,不依赖其他核的结果
在单核内,该核的任意输入数据块可以产生该输入数据块能产生的全部输出数据块
写出
每个核只写出最终结果,没有中间结果写出
切M或N
读入
若是切M后左矩阵分块被分到不同核则存在同一右矩阵分块被不同核(重复)读取
若是切N后右矩阵分块被分到不同核则存在同一左矩阵分块被不同核(重复)读取
单核会读取多个数据块,单个数据块可能会被一个或多个核读取
计算
每个最终结果数据块由每个核独立计算产生,不依赖其他核的结果
在单核内,该核的某个输入数据块只可以产生该输入数据块能产生的部分输出数据块
写出
每个核只写出最终结果,没有中间结果写出
切K
读入
每个数据块只会被固定的1个核读取
每核独立读取各自的多个数据块,不会读取其他核的数据块
计算
每个最终结果数据块由多个核计算产生依赖多个核的结果且需要Reduce
在单核内,该核的任意输入数据块可以产生该输入数据块能产生的全部输出数据块的中间结果
写出
单核存在中间结果写出需要与其他核的中间结果一起做reduce才能产生最终输出数据分块