Open utterances-bot opened 1 year ago
谢谢分享。有一个问题想提问一下,我在看openai的triton项目,是用的mlir来做降级的。
里面有Triton Dialect和TritonGPU Dialect,后面再从TritonGPU lower到LLVM的时候,我看到populate了很多Patterns。然后调用了applyPartialConversion。我比较关心其中一些pattern是怎么起作用的,于是也添加了不少llvm::errs()
或ir dump的打印。不过,我比较头疼的是,这个applyPartialConversion是怎么工作的。比如我这个RewritePatternSet有一百个patterns,benefit都是1。我不知道是按照什么顺序去对原始的moduleOp去作用这些patterns。比如我在pattern A里进出口都dump了IR,看到了该pattern A是如何作用于moduleOp的。但是从这个pattern A出去了之后,会继续调用哪个pattern?pattern A后来似乎又会被调用到,这个顺序让我比较难琢磨。
我倒是看了applyPatternsAndFoldGreedily(),在整个流程里,用到这个API的地方RewritePatternSet里pattern比较少,不到10个,而且benefit也有高低,因此,我大概整明白了这个的过程。但是对于applyPartialConversion,我的case里用到的pattern太多了,benefit似乎triton里都是1,所以我不明白这个怎么运作的。想请教一下,谢谢。
不知道作者是否愿意,重点讲解以下,“对比 linalg.matmul 和 linalg.conv2d_nhwc_hwcf 的 indexing maps“; 我没看懂affine_map,找了很多中文的翻译我也没看懂,这个affine_map是一个什么数学表达,看的一知半解,感觉上像是一种函数映射换算,或者一种地址映射,但是我没看懂这个映射的数学关系, 比如,affine_map<(m, n, k)[s0, s1, s2] -> (m, k)>,那维度参数n以及s0、s1、s2都不参与计算吗? 望不吝赐教,多谢了
不知道作者是否愿意,重点讲解以下,“对比 linalg.matmul 和 linalg.conv2d_nhwc_hwcf 的 indexing maps“; 我没看懂affine_map,找了很多中文的翻译我也没看懂,这个affine_map是一个什么数学表达,看的一知半解,感觉上像是一种函数映射换算,或者一种地址映射,但是我没看懂这个映射的数学关系, 比如,affine_map<(m, n, k)[s0, s1, s2] -> (m, k)>,那维度参数n以及s0、s1、s2都不参与计算吗? 望不吝赐教,多谢了
@carolove MLIR文档里有解释 https://mlir.llvm.org/docs/Dialects/Affine/
我觉得这篇pdf可能对linalg affine_map的解释更清晰,https://mlir.llvm.org/OpenMeetings/2022-01-27-Intro-to-Linalg.pdf
我当时没太理解的应该是linalg generic 中的affine_,map的含义,我是通过对比https://mlir.llvm.org/OpenMeetings/2022-01-27-Intro-to-Linalg.pdf 中对linalg.generic的indexing_maps的解释,https://mlir.llvm.org/docs/Dialects/Linalg/关于linalg generic的解释,才搞清楚,这个indexing_maps我理解是对输入输出tensor维度的映射关系的描述
MLIR Vector Dialect 以及 Patterns | Lei.Chat()
Vector dialect 及其相关变换 (transformation) 是机器学习代码生成流程中的重要一环。 今天我们来仔细分析一下其定位、设计、特性,并介绍其中的重要操作 (operation) 和变换, 最后用实例来说明如何恰当使用 vector dialect 相关功能。
https://www.lei.chat/zh/posts/mlir-vector-dialect-and-patterns/