tileop-api 增强需求:SuperNPUBench 算子所需的 4 处改动
-mlxbc 会注入 -I <ResourceDir>/include/tileop-api(驱动代码见
clang/lib/Driver/ToolChains/LinxV5Linux.cpp:77 与 LinxV5Toolchain.cpp:118),
这套头文件由组件仓库 LinxISA/Linx-TileOP-API(分支 linx,当前
make install CLANG_PREFIX=... 安装进 toolchain)提供。
为让 SuperNPUBench 的 control/hashtable_lookup_simd 与 sort/topk 端到端跑通,
我们此前在 SuperNPUBench 本地 include/ 里临时打了补丁并用 symlink 覆盖
toolchain 的 tileop-api。现已确认 tileop-api 的归属在编译器侧,故撤掉
SuperNPUBench 的本地副本与 symlink hack,把以下增强上游到编译器自带的 tileop-api。
当前 baseline(Linx-TileOP-API commit 91e3d7a / "Create fa-56 TileOP import
baseline",2026-06-22)仍存在下列 1~3 的缺陷,且缺少第 4 项的算子。
1. jcore/template_asm.hpp:THISTOGRAM 内联汇编操作数编号错位(off-by-one)
THISTOGRAM 模板的操作数编号比实际少 1,导致汇编到错误寄存器。
- "B.DIM zero, %c4, ->LB2\n"
- "B.IOT [%5, %6], last, ->%0<%c7>\n"
+ "B.DIM zero, %c5, ->LB2\n"
+ "B.IOT [%6, %7], last, ->%0<%c8>\n"
SuperNPUBench 的 sort/topk 直接调用 tileop-api 的标准 THISTOGRAM wrapper
(不再自带修正副本),因此 topk 阻塞在此项修复上。
2. jcore/TCmp.hpp:类型约束过严,拒绝合法的整型/浮点类型
现仅允许 int64/int32/float/__half,u16/u32 等会触发 static_assert。应放宽为
所有整型与浮点:
- if constexpr (std::is_same<typename tile_shape_in::DType, int64_t>::value ||
- std::is_same<typename tile_shape_in::DType, int32_t>::value ||
- std::is_same<typename tile_shape_in::DType, float>::value ||
- std::is_same<typename tile_shape_in::DType, __half>::value) {
+ if constexpr (std::is_integral<typename tile_shape_in::DType>::value ||
+ std::is_floating_point<typename tile_shape_in::DType>::value) {
(对应的 static_assert 分支同样放宽。)
3. jcore/TCast.hpp:SIMT <<<>>> 路径会让编译器在 ClockHands pass 崩溃
现有实现走 TCast_*_Imp<...><<<...>>>(...) 的 SIMT 路径,编译期崩溃。建议改为
tileblock-asm 的 TCVT(BSTART.TEPL TCVT + B.DATR SrcType/DstType)。ISA
v0.56 的 DataType 枚举(UINT16=26、UINT32=25、INT16=18…)支持 u16<->u32 等整型转换:
+#include "template_asm.hpp"
...
- size_t row = src.GetValidRow();
- size_t col = src.GetValidCol();
- static constexpr size_t row_lines =
- tile_shape_in::Rows / (LaneNum / tile_shape_in::InnerCols);
- if constexpr (is_Nz_layout<tile_shape_in>::value && is_Nz_layout<tile_shape_out>::value) {
- TCast_NzLayout_Imp<tile_shape_out, tile_shape_in><<<LaneNum, row_lines, 1>>>(dst.data(), src.data());
- } else if constexpr (tile_shape_in::isRowMajor && tile_shape_out::isRowMajor) {
- TCast_RowMajor_Imp<tile_shape_out, tile_shape_in><<<col, row, 1>>>(dst.data(), src.data());
- } else if constexpr (!tile_shape_in::isRowMajor && !tile_shape_out::isRowMajor) {
- TCast_ColMajor_Imp<tile_shape_out, tile_shape_in><<<row, col, 1>>>(dst.data(), src.data());
- } else {
- static_assert(tile_shape_in::isRowMajor && tile_shape_out::isRowMajor, "Storage layout type not supported");
- }
+ static_assert(tile_shape_in::isRowMajor == tile_shape_out::isRowMajor &&
+ is_Nz_layout<tile_shape_in>::value == is_Nz_layout<tile_shape_out>::value,
+ "TCAST requires identical layout on src and dst (pure type cast, no layout convert)");
+ TCVT_T(dst, src);
4. 新增 TXOR / TSLL / TSRL 三个按位/移位 tile op(control 算子需要)
ISA 有 v.xor / v.sll / v.srl,但 tileop-api 没有对应 wrapper。
control/hashtable_lookup_simd(MurmurHash3 纯 tile-op 版)需要它们。
新增内容(仿照已有 TAND/TOR):
jcore/TXor.hpp / jcore/TSll.hpp / jcore/TSrl.hpp(含 RowMajor/ColMajor 实现)
cpu_sim/TXor.hpp / cpu_sim/TSll.hpp / cpu_sim/TSrl.hpp(host 参考实现)
common/tileop_api.hpp:加 TXOR/TSLL/TSRL wrapper
common/tileop_api_impl.hpp:include 上述实现
TSRL 走 make_unsigned_t 保证逻辑右移。完整实现见 SuperNPUBench 历史 commit
804e112(include/jcore/{TXor,TSll,TSrl}.hpp、include/cpu_sim/{...})。
影响 / 现状
tileop-api 增强需求:SuperNPUBench 算子所需的 4 处改动
-mlxbc会注入-I <ResourceDir>/include/tileop-api(驱动代码见clang/lib/Driver/ToolChains/LinxV5Linux.cpp:77与LinxV5Toolchain.cpp:118),这套头文件由组件仓库
LinxISA/Linx-TileOP-API(分支linx,当前make install CLANG_PREFIX=...安装进 toolchain)提供。为让 SuperNPUBench 的
control/hashtable_lookup_simd与sort/topk端到端跑通,我们此前在 SuperNPUBench 本地
include/里临时打了补丁并用 symlink 覆盖toolchain 的 tileop-api。现已确认 tileop-api 的归属在编译器侧,故撤掉
SuperNPUBench 的本地副本与 symlink hack,把以下增强上游到编译器自带的 tileop-api。
当前 baseline(
Linx-TileOP-APIcommit91e3d7a/ "Create fa-56 TileOP importbaseline",2026-06-22)仍存在下列 1~3 的缺陷,且缺少第 4 项的算子。
1.
jcore/template_asm.hpp:THISTOGRAM 内联汇编操作数编号错位(off-by-one)THISTOGRAM 模板的操作数编号比实际少 1,导致汇编到错误寄存器。
SuperNPUBench 的
sort/topk直接调用 tileop-api 的标准THISTOGRAMwrapper(不再自带修正副本),因此 topk 阻塞在此项修复上。
2.
jcore/TCmp.hpp:类型约束过严,拒绝合法的整型/浮点类型现仅允许
int64/int32/float/__half,u16/u32 等会触发 static_assert。应放宽为所有整型与浮点:
(对应的 static_assert 分支同样放宽。)
3.
jcore/TCast.hpp:SIMT<<<>>>路径会让编译器在 ClockHands pass 崩溃现有实现走
TCast_*_Imp<...><<<...>>>(...)的 SIMT 路径,编译期崩溃。建议改为tileblock-asm 的
TCVT(BSTART.TEPL TCVT+B.DATRSrcType/DstType)。ISAv0.56 的 DataType 枚举(UINT16=26、UINT32=25、INT16=18…)支持 u16<->u32 等整型转换:
4. 新增
TXOR/TSLL/TSRL三个按位/移位 tile op(control 算子需要)ISA 有
v.xor/v.sll/v.srl,但 tileop-api 没有对应 wrapper。control/hashtable_lookup_simd(MurmurHash3 纯 tile-op 版)需要它们。新增内容(仿照已有
TAND/TOR):jcore/TXor.hpp/jcore/TSll.hpp/jcore/TSrl.hpp(含 RowMajor/ColMajor 实现)cpu_sim/TXor.hpp/cpu_sim/TSll.hpp/cpu_sim/TSrl.hpp(host 参考实现)common/tileop_api.hpp:加TXOR/TSLL/TSRLwrappercommon/tileop_api_impl.hpp:include 上述实现TSRL走make_unsigned_t保证逻辑右移。完整实现见 SuperNPUBench 历史 commit804e112(include/jcore/{TXor,TSll,TSrl}.hpp、include/cpu_sim/{...})。影响 / 现状
上游补齐前 blocked。
THISTOGRAMwrapper,依赖第 1 项,上游修好前 blocked。