Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions HONOR_CODE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# 2026 春季启元人工智能大赛诚信守则(Honor Code)


本人作为 2026 春季启元人工智能大赛(以下简称"比赛")的参赛选手,郑重承诺严格遵守比赛规则及本诚信守则,秉持诚信、公正、廉洁的参赛原则,自觉维护比赛的公平性与严肃性。本人充分理解并认可,违反本准则将导致参赛资格被取消、比赛成绩作废等相应后果,且愿意承担由此产生的一切责任。

## 一、参赛诚信承诺

1. 本人保证所提交的赛题PR(Pull Request)中包含的算子实现代码及相关文档,均为本人(及参赛团队,如为团队参赛)在比赛期间独立完成或在明确标注参考来源的基础上进行开发,不存在任何欺诈、抄袭、作弊行为。

2. 本人承诺主动、全面、真实地披露赛题实现过程中所有参考的外部资源,尤其是开源代码资源,不隐瞒任何可能影响比赛公平性的信息。

3. 本人保证不采用任何不正当手段获取比赛优势,包括但不限于窃取其他参赛选手的代码成果、利用非比赛允许的工具或技术、与他人串通作弊等。

## 二、参考资源说明

本人确认已按比赛要求,将本次赛题实现过程中涉及的参考资源信息单独撰写至`REFERENCE.md`文件中,该文件将与本诚信守则一同作为PR附件提交。`REFERENCE.md`需根据实际参考情况,按以下要求完整填写,信息不完整或虚假填写将视为违反本准则:

**情况1:无参考外部开源代码及核心实现思路**

`REFERENCE.md`中需明确声明:"本次赛题提交的算子代码、核心算法逻辑及实现方案均为本人(及参赛团队)独立设计与开发,未参考任何外部开源项目、技术文档中的核心代码片段或实现思路,未接受任何第三方的技术指导或代码支持。"

**情况2:有参考外部开源代码及相关资源**

对每个参考资源提供以下信息陈述:
1. 参考开源项目/资源名称

2. 参考资源链接(GitHub/Gitee/论文/技术文档等)

3. 参考的具体内容(请明确说明参考的代码片段、算法逻辑、实现思路等,需标注对应资源的具体位置,如文件路径、代码行数等)

4. 本人对参考内容的修改与优化说明:(请详细说明在参考基础上,本人所做的独立开发、修改、优化工作,体现自身技术贡献)

5. 若是开源项目,提供参考资源的开源协议类型:(如MIT、Apache 2.0、GPL等)

6. 其他需要补充说明的信息


## 三、禁止行为确认

本人明确知晓并承诺避免以下违反比赛公平性的行为,若存在以下任一情况,自愿接受比赛组委会的相应处罚:

1. 未经授权复制、抄袭他人(包括其他参赛选手、开源项目、商业代码)的代码、算法或技术方案,且未进行明确标注;

2. 隐瞒或虚假披露参考资源信息,包括遗漏重要参考来源、伪造参考内容说明等;

3. 与其他参赛选手或第三方串通,进行代码共享、成果交换等违规协作;

4. 利用比赛平台漏洞、技术缺陷或非比赛允许的工具获取不正当利益;

5. 伪造比赛相关证明材料、提交虚假信息;

6. 其他违反比赛规则及公序良俗的不诚信行为。


## 四、责任与确认

1. 本人充分理解,比赛组委会将对所有提交的PR进行代码溯源、参考信息核查等公平性审查,若发现本人存在违反本准则的行为,有权随时取消本人的参赛资格、作废比赛成绩,情节严重的将在比赛相关平台进行公示。

2. 若因本人违反本准则导致比赛争议或第三方权益受损(如开源协议侵权等),本人将独立承担全部法律责任及相关损失,与比赛组委会无关。

3. 本人确认已仔细阅读并完全理解本诚信守则的全部内容,自愿签署本准则,接受比赛组委会的监督与审查。

## 五、签署信息

参赛选手姓名:狄凡瑞

签署日期:2026年5月19日
96 changes: 96 additions & 0 deletions REFERENCE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# REFERENCE.md — T1-1-9 赛题参考资源声明

本次赛题提交属于**情况2**:有参考外部开源代码及相关资源。
以下按比赛要求逐项列出每个参考资源的信息。

---

## 参考 1:PyTorch 开源项目

1. **参考开源项目/资源名称**:PyTorch

2. **参考资源链接**:https://github.com/pytorch/pytorch

3. **参考的具体内容**:
- `aten/src/ATen/native/FractionalMaxPool2d.cpp`:fractional_max_pool2d 的 CUDA 实现,用于确认池化窗口起点计算公式(`alpha = (input_size - kernel_size) / (output_size - 1)`,`start[i] = int((i + sample) * alpha) - int(sample * alpha)` 等)、`_random_samples` 的维度和语义(shape `(N, C, 2)`,index 0 = W sample,index 1 = H sample)、最大值选择逻辑(`val > maxVal || isnan(val)`)、返回 indices 的格式(空间维扁平索引,不含 N/C)。
- `aten/src/ATen/native/FractionalMaxPool3d.cpp`:3D 扩展,sample 顺序(D, H, W)、flat spatial index 计算。
- `torch/nn/functional.py`:`multilabel_margin_loss` 的函数签名与语义。
- `torch/nn/modules/pooling.py`:`FractionalMaxPool2d`/`FractionalMaxPool3d` 参数约定。

4. **本人对参考内容的修改与优化说明**:
- 池化窗口公式的核心数学逻辑(alpha 计算、起点公式、last-window 边界处理)被精确复现以保证与 PyTorch 的输出一致性。并非直接复制 PyTorch C++ 代码,而是在九齿(ninetoothed)框架内用其 DSL(`ntl.where`、`ntl.cast`、`ntl.load`、pointer 算术等)重新实现了完整的 output-driven 2D/3D kernel。
- PyTorch 代码中 pool_start 在 CPU 侧预计算;本实现将公式完整下沉到 GPU kernel(application 函数)内,通过 `output.offsets(dim)` 解码多维坐标后实时计算。
- 增加了 tail mask(`valid = (n<N)&(c<C)&(oh<Ho)&(ow<Wo)`)保护 padding lane 越界,PyTorch 使用隐式边界检查。
- multilabel_margin_loss 的公式通过实验反推后,在九齿内用 O(C²) offsets-based 设计实现,非直接翻译 PyTorch C++ 代码。

5. **开源协议类型**:PyTorch 使用 BSD-3-Clause License。

6. **其他补充说明**:无。

---

## 参考 2:Ninetoothed(九齿)框架

1. **参考开源项目/资源名称**:ninetoothed(九齿 GPU 算子代码生成框架)

2. **参考资源链接**:https://github.com/InfiniTensor/ntops(随 ntops 仓库安装为 `pip install -e .` 的依赖)

3. **参考的具体内容**:
- `ninetoothed/generation.py`:code generator 的 `visit_Call` 方法(第 206-262 行),确认 `tensor.data_ptr()`、`tensor.offsets(dim)`、`tensor.stride(dim)` 在 application 函数中的可用性和约束。
- `ninetoothed/tensor.py`:Tensor 类的 `tile`、`flatten`、`ravel`、`offsets` 等方法的语义。
- `ninetoothed/symbol.py`:Symbol 算术运算符不继承 bounds 的行为(`__add__`、`__mul__` 等创建裸 AST 节点)。
- `ninetoothed/language.py`:`ntl.*` 操作通过 AST 映射到 `triton.language.*` 的机制。

4. **本人对参考内容的修改与优化说明**:
- 阅读框架源码以确认 API 边界,属于对开发工具的正常理解,不涉及对九齿框架本身的修改。
- 发现了 autotuning warmup 对有副作用 kernel(atomic_add)的数据污染问题,通过固定 `block_size` 为 Python int 绕开。
- 发现了全 concrete shape(`Tensor(shape=(N, C, H, W))`)可消除 Symbol 算术对 autotuning 的影响。

5. **开源协议类型**:随 ntops 仓库分发,ntops 使用 Apache 2.0 License。

6. **其他补充说明**:九齿是本赛题指定的开发框架,使用其为正常参赛行为。

---

## 参考 3:Triton 语言

1. **参考开源项目/资源名称**:Triton

2. **参考资源链接**:https://github.com/triton-lang/triton

3. **参考的具体内容**:
- `triton.language` 的 API 文档:`atomic_add`、`load`、`store`、`where`、`maximum`、`sum`、`cast`、`floor`、`ceil` 等原语的语义和参数。
- 确认 `tl.atomic_add` 支持向量化调用。
- 确认 `tl.trunc` 在当前版本不可用,改用 `where/floor/ceil` 实现。

4. **本人对参考内容的修改与优化说明**:
- 九齿 DSL 层不直接暴露所有 Triton 原语(如 `atomic_add`、`load`),通过阅读 generation.py 确认 code generator 会将 `ninetoothed.language.X` 无条件映射为 `triton.language.X`,从而在 application 函数中直接使用这些原语。
- 这是对开发工具链的正常理解,不涉及对 Triton 本身的修改。

5. **开源协议类型**:Triton 使用 MIT License。

6. **其他补充说明**:Triton 是九齿的底层编译后端,使用其为正常参赛行为。

---

## 参考 4:Fractional MaxPooling 论文

1. **参考资源名称**:Fractional Max-Pooling

2. **参考资源链接**:https://arxiv.org/abs/1412.6071

3. **参考的具体内容**:Benjamin Graham 提出的 fractional max pooling 算法的原始描述,包括随机步长池化的概念和基本公式。用于理解算子背景,不涉及代码参考。

4. **本人对参考内容的修改与优化说明**:
- 仅参考算法概念。实际公式以 PyTorch 2.12 CUDA 实现为准(见参考 1),论文公式与 PyTorch 实现存在差异。
- 九齿 kernel 的窗口起点计算、窗口扫描逻辑、indices 计算均为独立开发。

5. **开源协议类型**:学术论文,非软件项目。

6. **其他补充说明**:无。

---

## 补充声明

除上述明确标注的参考资源外,本次赛题提交的算子代码的核心算法逻辑及实现方案均为本人在比赛期间独立设计与开发。所有代码均使用九齿 DSL(arrangement/application/premake)或 Triton 语言从零编写,未直接复制任何外部项目的代码片段。
10 changes: 10 additions & 0 deletions src/ntops/kernels/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
dropout,
eq,
exp,
frac,
fractional_max_pool,
ge,
gelu,
gt,
Expand All @@ -25,14 +27,17 @@
max_pool2d,
mm,
mul,
multilabel_margin_loss,
ne,
neg,
pow,
reduce_sum,
relu,
rms_norm,
rotary_position_embedding,
rsqrt,
scaled_dot_product_attention,
scatter_add,
sigmoid,
silu,
sin,
Expand All @@ -57,6 +62,8 @@
"dropout",
"eq",
"exp",
"frac",
"fractional_max_pool",
"ge",
"gelu",
"gt",
Expand All @@ -68,14 +75,17 @@
"max_pool2d",
"mm",
"mul",
"multilabel_margin_loss",
"ne",
"neg",
"pow",
"reduce_sum",
"relu",
"rms_norm",
"rotary_position_embedding",
"rsqrt",
"scaled_dot_product_attention",
"scatter_add",
"sigmoid",
"silu",
"sin",
Expand Down
22 changes: 22 additions & 0 deletions src/ntops/kernels/frac.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import functools

import ninetoothed.language as ntl
from ninetoothed import Tensor

from ntops.kernels.element_wise import arrangement


def application(input, output):
# frac(x) = x - trunc(x)
# trunc(x) = floor(x) for x >= 0, ceil(x) for x < 0
# No tl.trunc available, so implement manually.
truncated = ntl.where(input >= 0, ntl.floor(input), ntl.ceil(input))
output = input - truncated # noqa: F841


def premake(ndim, dtype=None, block_size=None):
arrangement_ = functools.partial(arrangement, block_size=block_size)

tensors = (Tensor(ndim, dtype=dtype), Tensor(ndim, dtype=dtype))

return arrangement_, application, tensors
Loading