Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
使用AscendC对TBE实现的Sleep算子进行重构,完成开源仓算子贡献。旨在将传统的TBE算子迁移至AscendC架构并适配aclnn接口,解决了原TBE算子在昇腾Atlas 800I/T A2硬件上的适配问题,提升了算子的时序控制精度与代码可维护性。
Sleep算子的主要功能是在AI Core上实现精确的延时等待,通过忙等待(busy-spin)方式轮询硬件计数器SYS_CNT来实现纳秒级的时序控制。在性能测试、时序同步、流水线调度等场景中,精确的延时控制是一种基础且关键的操作,广泛应用于性能基准测试、多流同步、硬件行为验证等场景。AscendC的重构替代了原有基于软件定时器或外部控制的延时方案,直接利用硬件计数器SYS_CNT实现高精度延时,大幅提升了延时精度与执行效率。
整体设计思路是通过Host侧接收用户输入的cycles参数,并根据硬件平台特性(SYS_CNT频率与循环开销)进行周期数转换,然后传递给Kernel侧。Kernel侧采用忙等待策略,通过不断读取硬件计数器SYS_CNT并与目标值比较,实现精确的延时等待。
Aclnn直调
不涉及张量数据类型,仅处理int64_t类型的cycles参数(表示SYS_CNT硬件时钟周期数)
Host侧主要负责接收用户输入的cycles参数,并根据硬件平台特性进行周期数转换与Tiling参数配置:
周期数转换策略:用户输入的cycles表示期望的延时周期数,Host侧通过SCALE系数(SCALE=50e6/1.65e9≈1/33SCALE = 50e6 / 1.65e9 \approx 1/33SCALE=50e6/1.65e9≈1/33)将其转换为实际需要的SYS_CNT ticks。该系数通过实测获得,反映了do-while循环每次迭代的平均开销(包括GetSystemCycle()调用、比较、分支等指令)。
Tiling参数配置:将转换后的kernelCycles通过TilingData结构传递给Kernel侧。设置BlockDim为1(单核执行),TilingKey为固定值(SLEEP_TPL_SCH_MODE)。
边界处理:当转换后的kernelCycles小于1时,强制设为1,确保至少执行一次循环检查;当用户输入cycles ≤ 0时,kernelCycles设为0,Kernel侧直接跳过等待。
Kernel侧采用忙等待策略,直接利用硬件计数器实现精确延时:
Init阶段:获取Tiling参数,读取kernelCycles值。
Process阶段:
AscendC::GetSystemCycle()
GetSystemCycle()
Atlas 800I/T A2 训练系列产品、Atlas 800I/T A2 推理系列产品
clock64()
社区任务
关联PR:https://gitcode.com/cann/ops-nn/pull/5276
Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
Backgroud(背景信息)
一、背景信息(必填)
使用AscendC对TBE实现的Sleep算子进行重构,完成开源仓算子贡献。旨在将传统的TBE算子迁移至AscendC架构并适配aclnn接口,解决了原TBE算子在昇腾Atlas 800I/T A2硬件上的适配问题,提升了算子的时序控制精度与代码可维护性。
二、价值/作用(必填)
Sleep算子的主要功能是在AI Core上实现精确的延时等待,通过忙等待(busy-spin)方式轮询硬件计数器SYS_CNT来实现纳秒级的时序控制。在性能测试、时序同步、流水线调度等场景中,精确的延时控制是一种基础且关键的操作,广泛应用于性能基准测试、多流同步、硬件行为验证等场景。AscendC的重构替代了原有基于软件定时器或外部控制的延时方案,直接利用硬件计数器SYS_CNT实现高精度延时,大幅提升了延时精度与执行效率。
三、设计方案(必填)
整体设计思路是通过Host侧接收用户输入的cycles参数,并根据硬件平台特性(SYS_CNT频率与循环开销)进行周期数转换,然后传递给Kernel侧。Kernel侧采用忙等待策略,通过不断读取硬件计数器SYS_CNT并与目标值比较,实现精确的延时等待。
3.1 使能方式(涉及哪些框架:如Aclnn直调、Pytorch训练等)
Aclnn直调
3.2 总体设计
3.2.1 算子支持的数据类型
不涉及张量数据类型,仅处理int64_t类型的cycles参数(表示SYS_CNT硬件时钟周期数)
3.2.2 host侧设计
Host侧主要负责接收用户输入的cycles参数,并根据硬件平台特性进行周期数转换与Tiling参数配置:
周期数转换策略:用户输入的cycles表示期望的延时周期数,Host侧通过SCALE系数(SCALE=50e6/1.65e9≈1/33)将其转换为实际需要的SYS_CNT ticks。该系数通过实测获得,反映了do-while循环每次迭代的平均开销(包括GetSystemCycle()调用、比较、分支等指令)。
Tiling参数配置:将转换后的kernelCycles通过TilingData结构传递给Kernel侧。设置BlockDim为1(单核执行),TilingKey为固定值(SLEEP_TPL_SCH_MODE)。
边界处理:当转换后的kernelCycles小于1时,强制设为1,确保至少执行一次循环检查;当用户输入cycles ≤ 0时,kernelCycles设为0,Kernel侧直接跳过等待。
3.2.3 kernel侧设计
Kernel侧采用忙等待策略,直接利用硬件计数器实现精确延时:
Init阶段:获取Tiling参数,读取kernelCycles值。
Process阶段:
AscendC::GetSystemCycle()获取当前SYS_CNT值作为起始时间戳。GetSystemCycle()读取当前计数器值,并与target比较,直到当前值 ≥ target时退出循环。3.3 支持硬件
Atlas 800I/T A2 训练系列产品、Atlas 800I/T A2 推理系列产品
3.4 算子约束限制
备注(选填)
clock64()spin kernel,但使用硬件计数器而非软件定时器。Origin(信息来源)
社区任务
Benefit / Necessity (价值/作用)
Design(设计方案)