Skip to content

tileop-api: SuperNPUBench 所需的 4 处增强(THISTOGRAM 操作数修正 / TCmp 类型 / TCast 崩溃 / 新增 TXOR·TSLL·TSRL) #27

Description

@liujiang833

tileop-api 增强需求:SuperNPUBench 算子所需的 4 处改动

-mlxbc 会注入 -I <ResourceDir>/include/tileop-api(驱动代码见
clang/lib/Driver/ToolChains/LinxV5Linux.cpp:77LinxV5Toolchain.cpp:118),
这套头文件由组件仓库 LinxISA/Linx-TileOP-API(分支 linx,当前
make install CLANG_PREFIX=... 安装进 toolchain)提供。

为让 SuperNPUBench 的 control/hashtable_lookup_simdsort/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 的 TCVTBSTART.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 上述实现

TSRLmake_unsigned_t 保证逻辑右移。完整实现见 SuperNPUBench 历史 commit
804e112include/jcore/{TXor,TSll,TSrl}.hppinclude/cpu_sim/{...})。


影响 / 现状

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions