Open utterances-bot opened 1 year ago
请问下,第一个例子中的两个affine_map中 “20”和“30”是啥含义? %4 = affine.min affine_map<(d0)[s0, s1] -> (20, -d0 + s1)>(%arg3)[%c10, %0] %6 = affine.min affine_map<(d0)[s0, s1] -> (30, -d0 + s1)>(%arg5)[%c20, %2]
用 (M, N) = (10, 20) 的大小进行分块。 应该是处理余数段的吧?
用 (M, N) = (10, 20) 的大小进行分块。 %4 = affine.min affine_map<(d0)[s0, s1] -> (20, -d0 + s1)>(%arg3)[%c10, %0] %6 = affine.min affine_map<(d0)[s0, s1] -> (30, -d0 + s1)>(%arg5)[%c20, %2] 这是为了处理余数段的吧? 请问下,第一个例子中的两个affine_map中 “20”和“30”是啥含义?
@loongknown: 是的。affine.min
的结果被 tensor.extract_slice
用作 size,以保证 in bounds。对于起始的 tile,induction variable %arg3
/ %arg5
值比较小,这样 %0 - %arg3
/ %2 - %arg5
会大于 20 / 30,所以 affine.min
的结果会是 20 / 30。最后一个 tile 的 size 是 %0 - %arg3
/ %2 - %arg5
,可能会小于等于 20/30。例子中用的是 dynamic shape,可以代入几个 static shape 去计算一下,会比较直观。
用 (M, N) = (10, 20) 的大小进行分块,tile 的 size不是10和20么,为什么是20和30?
@hjchen2 @loongknown 确实,两者应该一致。不知道啥时候引入了这个奇怪的问题,之前我没注意到,造成了理解困难,抱歉。我修改了一下代码,现在应该一致了。
文中的示例可以有工程可以调试吗?
MLIR Linalg Dialect 以及 Patterns | Lei.Chat()
之前的文章介绍了 Vector dialect 及其相关 pattern。 今天我们来看一下上层的 Linalg dialect 以及相关的变换。
https://www.lei.chat/zh/posts/mlir-linalg-dialect-and-patterns/