[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-home-live-entry-setting":3,"site-header-contests":8,"site-header-camps":49,"news-detail-11f779a1-6089-4ce8-8dae-461ff1973e2a":104},{"enabled":4,"title":5,"statusText":5,"buttonText":5,"campSlug":5,"stage":6,"classroomId":7,"hasClassroom":4},false,"",0,null,{"total":9,"list":10,"pageNum":44,"pageSize":45,"size":9,"startRow":44,"endRow":9,"pages":44,"prePage":6,"nextPage":6,"isFirstPage":46,"isLastPage":46,"hasPreviousPage":4,"hasNextPage":4,"navigatePages":47,"navigatepageNums":48,"navigateFirstPage":44,"navigateLastPage":44},3,[11,25,35],{"slug":12,"title":13,"logo":7,"liveUrl":14,"prize":15,"sponsor":16,"description":17,"organizer":18,"startTime":19,"endTime":20,"registrationDeadline":21,"status":22,"dashboardVisibility":23,"createdAt":24},"spring2026","2026春季启元人工智能大赛","https:\u002F\u002Fwww.bilibili.com\u002Fblackboard\u002Flive\u002Flive-activity-player.html?cid=1822703816&quality=0","200,000","麒麟软件有限公司","“2026春季启元人工智能大赛”是由启元实验室主办的面向全国人工智能领域开发者、科研人员及高校学生的权威赛事。大赛旨在促进与培养具备工程实践能力和创新能力的优秀人工智能领域开发者、推广国产软硬件技术与生态、助力国家人工智能产业高质量发展。\n各参赛选手需在规定的比赛周期内，依据赛事规则选定赛题并完成相应挑战，优胜者将共同角逐总额20万元的赛事奖金池，并且还将有机会获得实习和知名企业优质岗位内推资格。","启元实验室","2026-04-19 16:00:00","2026-07-13 16:00:00","2026-06-16 16:00:00","ongoing","private","2026-04-16 08:00:00",{"slug":26,"title":27,"logo":7,"liveUrl":14,"prize":28,"sponsor":7,"description":29,"organizer":18,"startTime":30,"endTime":31,"registrationDeadline":32,"status":33,"dashboardVisibility":23,"createdAt":34},"autumn2025","2025秋季启元人工智能大赛","150,000","“2025秋季启元人工智能大赛”是由启元实验室主办的面向全国人工智能领域开发者、科研人员及高校学生的权威赛事。大赛旨在促进与培养具备工程实践能力和创新能力的优秀人工智能领域开发者、推广国产软硬件技术与生态、助力国家人工智能产业高质量发展。","2025-11-08 08:00:00","2026-01-13 08:00:00","2025-12-30 08:00:00","ended","2025-11-03 08:00:00",{"slug":36,"title":37,"logo":7,"liveUrl":14,"prize":38,"sponsor":7,"description":39,"organizer":18,"startTime":40,"endTime":41,"registrationDeadline":42,"status":33,"dashboardVisibility":23,"createdAt":43},"summer2025","启元人工智能大赛(系统方向)","80,000","启元人工智能大赛由启元实验室主办，其中系统赛道基于启元实验室九源软件栈的相关开源项目，通过拉动开源社区力量，一方面促进国产智能计算生态的发展，另一方面也为人工智能系统方向的学生及从业者提供一个实践平台。","2025-07-08 08:00:00","2025-08-25 08:00:00","2025-07-22 08:00:00","2025-06-22 08:00:00",1,5,true,8,[44],{"total":45,"list":50,"pageNum":44,"pageSize":45,"size":45,"startRow":44,"endRow":45,"pages":44,"prePage":6,"nextPage":6,"isFirstPage":46,"isLastPage":46,"hasPreviousPage":4,"hasNextPage":4,"navigatePages":47,"navigatepageNums":103,"navigateFirstPage":44,"navigateLastPage":44},[51,62,73,84,94],{"id":52,"slug":53,"title":54,"logo":55,"publicLiveEmbedUrl":14,"description":56,"introduction":57,"organizer":18,"coOrganizer":5,"sponsor":16,"startTime":58,"endTime":59,"status":22,"dashboardVisibility":60,"createdAt":58,"updatedAt":61},"019eeeff-6b00-7d55-a629-efafded3e232","summer2026","2026年夏季InfiniTensor大模型与人工智能系统训练营","https:\u002F\u002Foss.infinitensor.com\u002Fprod\u002Fuploads\u002F2026-06\u002F019eef7f-7816-7828-9309-79c2c61dd568.jpg?Expires=1793615428&OSSAccessKeyId=LTAI5t9R6uzvTa69CT92cFvV&Signature=%2FOpbzaXq9t2io55oWuN%2Fv0Etyqc%3D","由启元实验室发起的InfiniTensor大模型与人工智能系统训练营，面向开源社区、高校及产业界伙伴开放。活动以「普及AI全栈知识技术、培养工程实践与创新型人才、推广国产软硬件技术生态」为核心目标，助力国家人工智能产业高质量发展。","...","2026-06-22 08:00:00","2026-10-19 08:00:00","public","2026-10-12 08:00:00",{"id":63,"slug":64,"title":65,"logo":66,"publicLiveEmbedUrl":7,"description":67,"introduction":57,"organizer":18,"coOrganizer":5,"sponsor":68,"startTime":69,"endTime":70,"status":33,"dashboardVisibility":23,"createdAt":71,"updatedAt":72},"019af3f3-e06a-7245-aa8d-37dc99a69c73","winter2025","2025年冬季InfiniTensor大模型与人工智能系统训练营","https:\u002F\u002Foss.infinitensor.com\u002Fprod\u002Fuploads\u002F2025-12\u002F019afc69-b7ca-7805-91fb-605429671c01.png?Expires=1793615428&OSSAccessKeyId=LTAI5t9R6uzvTa69CT92cFvV&Signature=2IAcecfoAOYzCsiKw5f4VSSxINQ%3D","由启元实验室发起的InfiniTensor大模型与人工智能系统训练营，面向开源社区、高校及产业界伙伴开放。活动以「普及AI全栈知识技术、培养工程实践与创新型人才、推广国产软硬件技术生态」为核心目标，助力国家人工智能产业高质量发展。 \n","新华三技术有限公司","2025-12-25 08:00:00","2026-03-27 08:00:00","2025-12-06 08:00:00","2026-10-22 20:24:30",{"id":74,"slug":36,"title":75,"logo":76,"publicLiveEmbedUrl":7,"description":77,"introduction":57,"organizer":18,"coOrganizer":5,"sponsor":78,"startTime":79,"endTime":80,"status":81,"dashboardVisibility":23,"createdAt":82,"updatedAt":83},"01980342-208c-7803-b3f3-19e1d31960ba","2025年夏季InfiniTensor大模型与人工智能系统训练营","https:\u002F\u002Foss.infinitensor.com\u002Fprod\u002Fuploads\u002F2025-07\u002F0198045e-28fe-78f0-95fe-23835ce58395.jpg?Expires=1793615428&OSSAccessKeyId=LTAI5t9R6uzvTa69CT92cFvV&Signature=jLTYrzuQ%2BA%2F3EsLcFbYjgd%2BMiwY%3D","InfiniTensor大模型与人工智能系统训练营由启元实验室及清华大学 AI 系统方向团队发起，面向开源社区、高校和产业界，普及人工智能各方面知识和技术，培养相关人才。训练营联合开源项目开发者、学术界大牛、工业界资深工程师参与授课与项目指导。课程采用「线上直播授课 + 在线答疑 + 项目实践辅导 」的方式进行，确保每位同学都能获得充分成长。训练营全程免费，通过视频、直播课、习题和项目实践，在人工智能飞速发展的背景下，为学员提供一窥深层技术的机会。","北京积算科技有限公司","2025-07-14 08:00:00","2025-09-30 08:00:00","upcoming","2025-07-13 08:00:00","2026-10-22 20:24:58",{"id":85,"slug":86,"title":87,"logo":88,"publicLiveEmbedUrl":7,"description":89,"introduction":57,"organizer":18,"coOrganizer":5,"sponsor":5,"startTime":90,"endTime":91,"status":81,"dashboardVisibility":23,"createdAt":92,"updatedAt":93},"01980cf9-a7d8-7796-ae86-0bbe05334add","winter2024","2024年冬季InfiniTensor大模型与人工智能系统训练营","https:\u002F\u002Ftesting-cdn.infinitensor.com\u002Fuploads\u002F2025-07\u002F01981269-ce23-7624-a287-9f07dd0d85f6.jpg","InfiniTensor大模型与人工智能系统训练营由清华大学发起，面向开源社区、高校和产业界，普及人工智能各方面知识和技术，培养相关人才。训练营全程免费，通过视频、直播课、习题和项目实践，在人工智能飞速发展的背景下，为学员提供一窥深层技术的机会。报名学员请阅读“导学”课程页的训练营介绍。","2025-01-05 08:00:00","2025-03-22 08:00:00","2025-07-15 08:00:00","2026-10-22 20:24:39",{"id":95,"slug":96,"title":97,"logo":98,"publicLiveEmbedUrl":7,"description":99,"introduction":57,"organizer":18,"coOrganizer":5,"sponsor":5,"startTime":100,"endTime":101,"status":81,"dashboardVisibility":23,"createdAt":92,"updatedAt":102},"01980c20-363a-7dc3-8f5a-58a68e08dcc4","summer2024","2024年夏季InfiniTensor大模型与人工智能系统训练营","https:\u002F\u002Ftesting-cdn.infinitensor.com\u002Fuploads\u002F2025-07\u002F01981269-fbfa-788a-afcd-17fa9be74ff9.jpg","InfiniTensor大模型与人工智能系统训练营由清华大学发起，面向开源社区和高校，普及人工智能各方面知识和技术，培养相关人才。训练营全程免费，通过课程、习题和项目实践，在人工智能飞速发展的背景下，为学员提供一窥深层技术的机会。","2024-07-20 08:00:00","2024-09-29 08:00:00","2026-10-22 20:24:49",[44],{"newsDetail":105,"processedData":128},{"publishTime":106,"img":107,"keywords":108,"treeType":44,"description":109,"showStatus":44,"updateTime":110,"type":44,"title":111,"content":112,"nextArticle":113,"createTime":119,"sortOrder":6,"canonicalPath":120,"id":121,"contentType":122,"prevArticle":123},"2026-11-02 16:00:00","https:\u002F\u002Foss.infinitensor.com\u002Fprod\u002Fdata\u002Fqy-test\u002Fuploads\u002F2026-11\u002F98096913-f777-4fda-9177-45f7cd286fae.jpg?Expires=1793615428&OSSAccessKeyId=LTAI5t9R6uzvTa69CT92cFvV&Signature=7lNTp4evjE0uQaRKhwXRmsrp7Aw%3D","九齿,GPU 算子,算子开发,开源技术周,编译器","九齿推出简化编程接口，借助 axes 命名维度，简化张量排布代码，由编译器完成广播、对齐，降低 GPU 算子开发难度，附带代码示例与开源仓库链接。","2026-11-02 12:34:29","九源开源技术周 02 | 九齿简化编程接口：让 GPU 算子更好写","![](https:\u002F\u002Foss.infinitensor.com\u002Fprod\u002Fdata\u002Fqy-test\u002Fuploads\u002F2026-11\u002F21ab1cde-b5bf-45dc-8f60-6e301dc036c2.jpg?Expires=1793615428&OSSAccessKeyId=LTAI5t9R6uzvTa69CT92cFvV&Signature=rDwaZWN3czcgwIsD37RE9tVzBkw%3D)\n\n\n\u003Cspan style=\"font-size:13px;color:#777;\">写一个矩阵乘，计算过程往往没几行，前面的数据排布却能绕上好一阵。九齿过去的接口就有这个问题：分完块以后，还要广播、调整层次、去掉多余的维度，才能让计算拿到正确的数据。\u003C\u002Fspan>\n\n九齿一直想让大家**按串行的思路写计算，把并行化交给编译器**。最近，我们把编程接口做了一轮简化。以矩阵乘为例，现在两个输入和一个输出各写一行，就能把分块和维度关系说清楚，块之间的对齐和广播交给编译器。\n\n### 先看矩阵乘的变化\n\n左矩阵是 $M \\times K$，右矩阵是 $K \\times N$，输出是 $M \\times N$。沿三个方向分块，块大小分别记作 `BM`、`BN`、`BK`。\n\n#### 旧接口要这样安排数据：\n\n```python\ndef arrangement(lhs, rhs, output):\n    output = output.tile((BM, BN))\n\n    lhs = lhs.tile((BM, BK)).tile((1, -1))\n    lhs = lhs.expand((-1, output.shape[1]))\n    lhs.dtype = lhs.dtype.squeeze(0)\n\n    rhs = rhs.tile((BK, BN)).tile((-1, 1))\n    rhs = rhs.expand((output.shape[0], -1))\n    rhs.dtype = rhs.dtype.squeeze(1)\n\n    return lhs, rhs, output\n```\n\n这一串操作，是为了给每个输出块配好沿 K 方向要读取的输入：左矩阵的一行块、右矩阵的一列块。写的时候要想清楚，过段时间再回来读，也得重新捋一遍每次变换后的形状。[1]\n\n#### 现在，同样的排布可以这样写：\n\n```python\nBM, BN, BK = 16, 64, 32\n\ndef arrangement(lhs, rhs, output):\n    return (\n        lhs.axes(\"m\", \"k\").tile((BM, BK)),\n        rhs.axes(\"k\", \"n\").tile((BK, BN)),\n        output.axes(\"m\", \"n\").tile((BM, BN)),\n    )\n```\n\n三个张量，各自一行。原来额外写的两次 `tile`、两次 `expand`、两次 `squeeze`，都省掉了。[2]\n\n\n `axes` 给维度标上名字。左矩阵是 `m`、`k`，右矩阵是 `k`、`n`，输出是 `m`、`n`，看代码就能读出它们的关系。\n>\n> 左矩阵的一行块要供不同输出列使用，右矩阵的一列块要供不同输出行使用，这些对应关系也就有了依据。**编译器结合后面的计算，在编译阶段补上原来手写的对齐、广播和层次整理。** [3]\n\n### 计算照着原来的思路写\n\n数据排布和计算仍然分开写。比如想试另一组块大小，可以调整前面的 `arrangement`，后面的乘加逻辑继续复用：\n\n```python\nimport ninetoothed.language as ntl\n\ndef application(lhs, rhs, output):\n    accumulator = ntl.zeros(output.shape, dtype=ntl.float32)\n\n    for k in range(lhs.shape[0]):\n        accumulator = accumulator + ntl.dot(lhs[k], rhs[k])\n\n    output = accumulator.to(output.dtype)\n```\n\n每次取出一对输入块，做一次小矩阵乘，加到 `accumulator` 里，最后写出当前输出块。这里的 `lhs[k]` 和 `rhs[k]` 都是数据块，`k` 数的是第几个块。[2]\n\n拿两个 $1024 \\times 1024$ 的矩阵举例，按上面的块大小，输出会分成 1024 个 $16 \\times 64$ 的小块。每个输出块沿 K 方向做 32 次块乘加，就能算出结果。**我们写的是其中一块怎样顺序计算，九齿负责把它按输出块网格并行展开。** [1][3]\n\n### 加偏置和激活也更直接\n\n实际写算子时，矩阵乘后面经常还跟着偏置、残差和激活。加上这些计算，排布也不用重新绕一遍。\n\n比如，偏置只有 N 个元素，残差和输出一样是 $M \\times N$，对应的排布声明就是：\n\n```python\nbias.axes(\"n\").tile((BN,))\nresidual.axes(\"m\", \"n\").tile((BM, BN))\n```\n\n偏置没有 `m` 这一维，每一行都要用到它，编译器会补上这层广播；残差则按 `m`、`n` 和输出块对齐。把这两个输入加进来后，最后的输出赋值可以直接换成：\n\n```python\noutput = ntl.maximum(\n    accumulator + bias + residual, 0\n).to(output.dtype)\n```\n\n偏置、残差和 ReLU 直接接在矩阵乘后面，整个过程仍写在同一个 `application` 里。各个输入与输出的对应关系，也写在前面的排布声明中。[4]\n\n### 接下来还想怎么简化\n\n接下来，我们希望写算子能更接近写普通函数。\n\n-   能从计算中推导出的维度关系，就交给编译器，不用再逐个声明；\n-   已经写好的矩阵乘，也能直接调用，组合进新的算子，不必把排布和块循环再写一遍。\n\n**编译器负责处理组合时的数据排布，让开发者更多地按算法的思路写代码。**\n\n\n### 🔗 相关链接\n\n**开发分支：** \nhttps:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Ftree\u002Fadd-named-axis-layouts\n\n**[1] 旧版矩阵乘：** \nhttps:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Fblob\u002Fbe70e1ac59454443f2464827d684e22c34846a65\u002Fdocs\u002Fsource\u002Fbasics.rst\n\n**[2] 新版矩阵乘：** https:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Fblob\u002Ff1148467f6b94e27347d442a94244686ab30873e\u002Fexamples\u002Fnamed_gemm.py\n\n**[3] 接口说明：** \nhttps:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Fblob\u002Ff1148467f6b94e27347d442a94244686ab30873e\u002Fdocs\u002Fsource\u002Fnamed_layout.rst\n\n**[4] 偏置与残差示例：** https:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Fblob\u002Ff1148467f6b94e27347d442a94244686ab30873e\u002Ftests\u002Ftest_named_layout.py\n\n## 关注与交流\n\n![](https:\u002F\u002Foss.infinitensor.com\u002Fprod\u002Fdata\u002Fqy-test\u002Fuploads\u002F2026-11\u002Fd8bac3bb-dea3-42dd-a782-0c144da992d8.jpg?Expires=1793615428&OSSAccessKeyId=LTAI5t9R6uzvTa69CT92cFvV&Signature=NxjTINF7IVUDU4qyEXLS4ANX1ww%3D)",{"publishTime":114,"createTime":115,"canonicalPath":116,"id":117,"title":118},"2026-10-29 08:00:00","2026-10-30 15:25:24","\u002Fnews\u002Fa0d320d8-61f0-48b1-b3c8-9454d19751c2","a0d320d8-61f0-48b1-b3c8-9454d19751c2","九源开源技术周 01 | InfiniLoader：用内存缓存加速模型加载","2026-11-02 12:17:11","\u002Fnews\u002F11f779a1-6089-4ce8-8dae-461ff1973e2a","11f779a1-6089-4ce8-8dae-461ff1973e2a","markdown",{"publishTime":106,"createTime":124,"canonicalPath":125,"id":126,"title":127},"2026-11-02 12:24:05","\u002Fnews\u002F60d71ec8-450f-40b7-842f-44af5a77f836","60d71ec8-450f-40b7-842f-44af5a77f836","九源开源技术周 04 | 九齿多后端，让简单的算子代码跑得更快",{"htmlContent":129,"headings":130},"\u003Cp>\u003Cimg src=\"https:\u002F\u002Foss.infinitensor.com\u002Fprod\u002Fdata\u002Fqy-test\u002Fuploads\u002F2026-11\u002F21ab1cde-b5bf-45dc-8f60-6e301dc036c2.jpg?Expires=1793615428&OSSAccessKeyId=LTAI5t9R6uzvTa69CT92cFvV&Signature=rDwaZWN3czcgwIsD37RE9tVzBkw%3D\" alt=\"\">\u003C\u002Fp>\n\u003Cp>\u003Cspan style=\"font-size:13px;color:#777;\">写一个矩阵乘，计算过程往往没几行，前面的数据排布却能绕上好一阵。九齿过去的接口就有这个问题：分完块以后，还要广播、调整层次、去掉多余的维度，才能让计算拿到正确的数据。\u003C\u002Fspan>\u003C\u002Fp>\n\u003Cp>九齿一直想让大家\u003Cstrong>按串行的思路写计算，把并行化交给编译器\u003C\u002Fstrong>。最近，我们把编程接口做了一轮简化。以矩阵乘为例，现在两个输入和一个输出各写一行，就能把分块和维度关系说清楚，块之间的对齐和广播交给编译器。\u003C\u002Fp>\n\u003Ch3 id=\"先看矩阵乘的变化\">\u003Ca class=\"anchor\" href=\"#先看矩阵乘的变化\" aria-label=\"跳转到标题：先看矩阵乘的变化\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>先看矩阵乘的变化\u003C\u002Fh3>\u003Cp>左矩阵是 $M \\times K$，右矩阵是 $K \\times N$，输出是 $M \\times N$。沿三个方向分块，块大小分别记作 \u003Ccode>BM\u003C\u002Fcode>、\u003Ccode>BN\u003C\u002Fcode>、\u003Ccode>BK\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Ch4 id=\"旧接口要这样安排数据\">\u003Ca class=\"anchor\" href=\"#旧接口要这样安排数据\" aria-label=\"跳转到标题：旧接口要这样安排数据：\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>旧接口要这样安排数据：\u003C\u002Fh4>\u003Cpre>\u003Ccode class=\"language-python\">def arrangement(lhs, rhs, output):\n    output = output.tile((BM, BN))\n\n    lhs = lhs.tile((BM, BK)).tile((1, -1))\n    lhs = lhs.expand((-1, output.shape[1]))\n    lhs.dtype = lhs.dtype.squeeze(0)\n\n    rhs = rhs.tile((BK, BN)).tile((-1, 1))\n    rhs = rhs.expand((output.shape[0], -1))\n    rhs.dtype = rhs.dtype.squeeze(1)\n\n    return lhs, rhs, output\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>这一串操作，是为了给每个输出块配好沿 K 方向要读取的输入：左矩阵的一行块、右矩阵的一列块。写的时候要想清楚，过段时间再回来读，也得重新捋一遍每次变换后的形状。[1]\u003C\u002Fp>\n\u003Ch4 id=\"现在-同样的排布可以这样写\">\u003Ca class=\"anchor\" href=\"#现在-同样的排布可以这样写\" aria-label=\"跳转到标题：现在，同样的排布可以这样写：\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>现在，同样的排布可以这样写：\u003C\u002Fh4>\u003Cpre>\u003Ccode class=\"language-python\">BM, BN, BK = 16, 64, 32\n\ndef arrangement(lhs, rhs, output):\n    return (\n        lhs.axes(&quot;m&quot;, &quot;k&quot;).tile((BM, BK)),\n        rhs.axes(&quot;k&quot;, &quot;n&quot;).tile((BK, BN)),\n        output.axes(&quot;m&quot;, &quot;n&quot;).tile((BM, BN)),\n    )\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>三个张量，各自一行。原来额外写的两次 \u003Ccode>tile\u003C\u002Fcode>、两次 \u003Ccode>expand\u003C\u002Fcode>、两次 \u003Ccode>squeeze\u003C\u002Fcode>，都省掉了。[2]\u003C\u002Fp>\n\u003Cp> \u003Ccode>axes\u003C\u002Fcode> 给维度标上名字。左矩阵是 \u003Ccode>m\u003C\u002Fcode>、\u003Ccode>k\u003C\u002Fcode>，右矩阵是 \u003Ccode>k\u003C\u002Fcode>、\u003Ccode>n\u003C\u002Fcode>，输出是 \u003Ccode>m\u003C\u002Fcode>、\u003Ccode>n\u003C\u002Fcode>，看代码就能读出它们的关系。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>左矩阵的一行块要供不同输出列使用，右矩阵的一列块要供不同输出行使用，这些对应关系也就有了依据。\u003Cstrong>编译器结合后面的计算，在编译阶段补上原来手写的对齐、广播和层次整理。\u003C\u002Fstrong> [3]\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3 id=\"计算照着原来的思路写\">\u003Ca class=\"anchor\" href=\"#计算照着原来的思路写\" aria-label=\"跳转到标题：计算照着原来的思路写\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>计算照着原来的思路写\u003C\u002Fh3>\u003Cp>数据排布和计算仍然分开写。比如想试另一组块大小，可以调整前面的 \u003Ccode>arrangement\u003C\u002Fcode>，后面的乘加逻辑继续复用：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-python\">import ninetoothed.language as ntl\n\ndef application(lhs, rhs, output):\n    accumulator = ntl.zeros(output.shape, dtype=ntl.float32)\n\n    for k in range(lhs.shape[0]):\n        accumulator = accumulator + ntl.dot(lhs[k], rhs[k])\n\n    output = accumulator.to(output.dtype)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>每次取出一对输入块，做一次小矩阵乘，加到 \u003Ccode>accumulator\u003C\u002Fcode> 里，最后写出当前输出块。这里的 \u003Ccode>lhs[k]\u003C\u002Fcode> 和 \u003Ccode>rhs[k]\u003C\u002Fcode> 都是数据块，\u003Ccode>k\u003C\u002Fcode> 数的是第几个块。[2]\u003C\u002Fp>\n\u003Cp>拿两个 $1024 \\times 1024$ 的矩阵举例，按上面的块大小，输出会分成 1024 个 $16 \\times 64$ 的小块。每个输出块沿 K 方向做 32 次块乘加，就能算出结果。\u003Cstrong>我们写的是其中一块怎样顺序计算，九齿负责把它按输出块网格并行展开。\u003C\u002Fstrong> [1][3]\u003C\u002Fp>\n\u003Ch3 id=\"加偏置和激活也更直接\">\u003Ca class=\"anchor\" href=\"#加偏置和激活也更直接\" aria-label=\"跳转到标题：加偏置和激活也更直接\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>加偏置和激活也更直接\u003C\u002Fh3>\u003Cp>实际写算子时，矩阵乘后面经常还跟着偏置、残差和激活。加上这些计算，排布也不用重新绕一遍。\u003C\u002Fp>\n\u003Cp>比如，偏置只有 N 个元素，残差和输出一样是 $M \\times N$，对应的排布声明就是：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-python\">bias.axes(&quot;n&quot;).tile((BN,))\nresidual.axes(&quot;m&quot;, &quot;n&quot;).tile((BM, BN))\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>偏置没有 \u003Ccode>m\u003C\u002Fcode> 这一维，每一行都要用到它，编译器会补上这层广播；残差则按 \u003Ccode>m\u003C\u002Fcode>、\u003Ccode>n\u003C\u002Fcode> 和输出块对齐。把这两个输入加进来后，最后的输出赋值可以直接换成：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-python\">output = ntl.maximum(\n    accumulator + bias + residual, 0\n).to(output.dtype)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>偏置、残差和 ReLU 直接接在矩阵乘后面，整个过程仍写在同一个 \u003Ccode>application\u003C\u002Fcode> 里。各个输入与输出的对应关系，也写在前面的排布声明中。[4]\u003C\u002Fp>\n\u003Ch3 id=\"接下来还想怎么简化\">\u003Ca class=\"anchor\" href=\"#接下来还想怎么简化\" aria-label=\"跳转到标题：接下来还想怎么简化\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>接下来还想怎么简化\u003C\u002Fh3>\u003Cp>接下来，我们希望写算子能更接近写普通函数。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>能从计算中推导出的维度关系，就交给编译器，不用再逐个声明；\u003C\u002Fli>\n\u003Cli>已经写好的矩阵乘，也能直接调用，组合进新的算子，不必把排布和块循环再写一遍。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>编译器负责处理组合时的数据排布，让开发者更多地按算法的思路写代码。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ch3 id=\"相关链接\">\u003Ca class=\"anchor\" href=\"#相关链接\" aria-label=\"跳转到标题：🔗 相关链接\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>🔗 相关链接\u003C\u002Fh3>\u003Cp>\u003Cstrong>开发分支：\u003C\u002Fstrong>\u003Cbr>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Ftree\u002Fadd-named-axis-layouts\">https:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Ftree\u002Fadd-named-axis-layouts\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>[1] 旧版矩阵乘：\u003C\u002Fstrong>\u003Cbr>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Fblob\u002Fbe70e1ac59454443f2464827d684e22c34846a65\u002Fdocs\u002Fsource\u002Fbasics.rst\">https:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Fblob\u002Fbe70e1ac59454443f2464827d684e22c34846a65\u002Fdocs\u002Fsource\u002Fbasics.rst\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>[2] 新版矩阵乘：\u003C\u002Fstrong> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Fblob\u002Ff1148467f6b94e27347d442a94244686ab30873e\u002Fexamples\u002Fnamed_gemm.py\">https:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Fblob\u002Ff1148467f6b94e27347d442a94244686ab30873e\u002Fexamples\u002Fnamed_gemm.py\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>[3] 接口说明：\u003C\u002Fstrong>\u003Cbr>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Fblob\u002Ff1148467f6b94e27347d442a94244686ab30873e\u002Fdocs\u002Fsource\u002Fnamed_layout.rst\">https:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Fblob\u002Ff1148467f6b94e27347d442a94244686ab30873e\u002Fdocs\u002Fsource\u002Fnamed_layout.rst\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>[4] 偏置与残差示例：\u003C\u002Fstrong> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Fblob\u002Ff1148467f6b94e27347d442a94244686ab30873e\u002Ftests\u002Ftest_named_layout.py\">https:\u002F\u002Fgithub.com\u002FInfiniTensor\u002Fninetoothed\u002Fblob\u002Ff1148467f6b94e27347d442a94244686ab30873e\u002Ftests\u002Ftest_named_layout.py\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch2 id=\"关注与交流\">\u003Ca class=\"anchor\" href=\"#关注与交流\" aria-label=\"跳转到标题：关注与交流\">\u003Cspan class=\"octicon octicon-link\">\u003C\u002Fspan>\u003C\u002Fa>关注与交流\u003C\u002Fh2>\u003Cp>\u003Cimg src=\"https:\u002F\u002Foss.infinitensor.com\u002Fprod\u002Fdata\u002Fqy-test\u002Fuploads\u002F2026-11\u002Fd8bac3bb-dea3-42dd-a782-0c144da992d8.jpg?Expires=1793615428&OSSAccessKeyId=LTAI5t9R6uzvTa69CT92cFvV&Signature=NxjTINF7IVUDU4qyEXLS4ANX1ww%3D\" alt=\"\">\u003C\u002Fp>\n",[131,133,137,140,142,144,146,149],{"id":132,"text":132,"level":9},"先看矩阵乘的变化",{"id":134,"text":135,"level":136},"旧接口要这样安排数据","旧接口要这样安排数据：",4,{"id":138,"text":139,"level":136},"现在-同样的排布可以这样写","现在，同样的排布可以这样写：",{"id":141,"text":141,"level":9},"计算照着原来的思路写",{"id":143,"text":143,"level":9},"加偏置和激活也更直接",{"id":145,"text":145,"level":9},"接下来还想怎么简化",{"id":147,"text":148,"level":9},"相关链接","🔗 相关链接",{"id":150,"text":150,"level":151},"关注与交流",2]