antiagainst / antiagainst.github.io

Generated website for my personal blog
https://lei.chat/
6 stars 0 forks source link

MLIR Linalg Dialect 以及 Patterns | Lei.Chat() #13

Open utterances-bot opened 1 year ago

utterances-bot commented 1 year ago

MLIR Linalg Dialect 以及 Patterns | Lei.Chat()

之前的文章介绍了 Vector dialect 及其相关 pattern。 今天我们来看一下上层的 Linalg dialect 以及相关的变换。

https://www.lei.chat/zh/posts/mlir-linalg-dialect-and-patterns/

loongknown commented 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]

loongknown commented 1 year ago

用 (M, N) = (10, 20) 的大小进行分块。 应该是处理余数段的吧?

loongknown commented 1 year ago

用 (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”是啥含义?

antiagainst commented 1 year ago

@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 去计算一下,会比较直观。

hjchen2 commented 1 year ago

用 (M, N) = (10, 20) 的大小进行分块,tile 的 size不是10和20么,为什么是20和30?

antiagainst commented 1 year ago

@hjchen2 @loongknown 确实,两者应该一致。不知道啥时候引入了这个奇怪的问题,之前我没注意到,造成了理解困难,抱歉。我修改了一下代码,现在应该一致了。

pengl commented 3 weeks ago

文中的示例可以有工程可以调试吗?