<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Tilelang on KKKZOZ&#39;s Blog</title>
    <link>http://blog.kkkzoz.top/tags/tilelang/</link>
    <description>Recent content in Tilelang on KKKZOZ&#39;s Blog</description>
    <image>
      <title>KKKZOZ&#39;s Blog</title>
      <url>http://blog.kkkzoz.top/images/papermod-cover.png</url>
      <link>http://blog.kkkzoz.top/images/papermod-cover.png</link>
    </image>
    <generator>Hugo -- 0.147.0</generator>
    <language>en</language>
    <lastBuildDate>Mon, 17 Aug 2026 22:56:46 +0800</lastBuildDate>
    <atom:link href="http://blog.kkkzoz.top/tags/tilelang/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Production Ready Tilelang Ops Framework</title>
      <link>http://blog.kkkzoz.top/posts/learning/gpu-kernels/tilelang/production-ready-tilelang-ops/</link>
      <pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate>
      <guid>http://blog.kkkzoz.top/posts/learning/gpu-kernels/tilelang/production-ready-tilelang-ops/</guid>
      <description>&lt;p&gt;在生产环境下使用 Tilelang，需要考虑几个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;算子缓存&lt;/li&gt;
&lt;li&gt;与 torch.compile 兼容&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;算子缓存&#34;&gt;算子缓存&lt;/h2&gt;
&lt;h3 id=&#34;算子定义&#34;&gt;算子定义&lt;/h3&gt;
&lt;p&gt;在了解算子缓存之前，我们需要了解一个 GPU 算子应该如何定义，通常由三部分组成：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;参数类型&lt;/th&gt;
          &lt;th&gt;RMSNorm 中的实例&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;问题规格（Workload / specialization parameters）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;M, N, eps, dtype&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;确定一类具体计算问题&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;调度参数（Schedule / config / meta-parameters）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;block_m, threads&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;确定该 workload 的一种实现方案&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;运行时参数（Runtime arguments / operands）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;x, weight&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;每次调用时传入的实际数据&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;在代码里对应得非常直接：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;_rms_norm_kernel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;M&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;N&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;eps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dtype&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;# workload parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;_func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;block_m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;threads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;     &lt;span class=&#34;c1&#34;&gt;# schedule/meta-parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;      &lt;span class=&#34;c1&#34;&gt;# runtime arguments&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这三类参数不是一次性传给同一个函数，而是在 kernel 从定义到执行的过程中逐层绑定：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;jit_impl&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_rms_norm_kernel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;M&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;N&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;eps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dtype&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;jit_kernel&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;jit_impl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;block_m&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;threads&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;jit_kernel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;第一步绑定 workload 参数，得到 TileLang &lt;code&gt;JITImpl&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;描述一个确定的计算问题，例如处理形状为 &lt;code&gt;(M, N)&lt;/code&gt;、数据类型为 &lt;code&gt;dtype&lt;/code&gt; 的 RMSNorm，但尚未确定具体的调度方案。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第二步绑定 schedule 参数，得到可以执行的 &lt;code&gt;JITKernel&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;block_m/threads&lt;/code&gt; 可以来自默认配置、手动配置或 autotune&lt;/li&gt;
&lt;li&gt;不同 schedule 对应同一个 workload 的不同实现版本&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;最后传入 &lt;code&gt;x/weight&lt;/code&gt; 等 runtime arguments，启动已经选定的 &lt;code&gt;JITKernel&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;运行数据只参与本次调用，不改变前面已经确定的 workload 和 schedule&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;算子调用流程&#34;&gt;算子调用流程&lt;/h3&gt;
&lt;p&gt;一次真实的算子调用从业务 &lt;code&gt;Op&lt;/code&gt; 开始，依次确定 workload、选择 schedule、取得编译结果，最后才把 Tensor 作为 runtime arguments 启动 kernel&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
