已关闭
[Requirement|需求建议]: 【社区任务】Sleep算子AscendC实现贡献 #3348
fangfangssj创建于  6月15日关闭于  6月23日
fangfangssj
fangfangssj
6月15日 创建

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参数配置:

  1. 周期数转换策略:用户输入的cycles表示期望的延时周期数,Host侧通过SCALE系数(SCALE=50e6/1.65e9≈1/33SCALE = 50e6 / 1.65e9 \approx 1/33)将其转换为实际需要的SYS_CNT ticks。该系数通过实测获得,反映了do-while循环每次迭代的平均开销(包括GetSystemCycle()调用、比较、分支等指令)。

  2. Tiling参数配置:将转换后的kernelCycles通过TilingData结构传递给Kernel侧。设置BlockDim为1(单核执行),TilingKey为固定值(SLEEP_TPL_SCH_MODE)。

  3. 边界处理:当转换后的kernelCycles小于1时,强制设为1,确保至少执行一次循环检查;当用户输入cycles ≤ 0时,kernelCycles设为0,Kernel侧直接跳过等待。

3.2.3 kernel侧设计

Kernel侧采用忙等待策略,直接利用硬件计数器实现精确延时:

  1. Init阶段:获取Tiling参数,读取kernelCycles值。

  2. Process阶段:

    • 计数器初始化:调用AscendC::GetSystemCycle()获取当前SYS_CNT值作为起始时间戳。
    • 目标计算:计算目标时间戳 target=start+cyclestarget = start + cycles。
    • 忙等待循环:使用do-while循环不断调用GetSystemCycle()读取当前计数器值,并与target比较,直到当前值 ≥ target时退出循环。
    • 优化策略:采用"预计算目标值"策略(target=start+cyclestarget = start + cycles)而非"计算已流逝时间"策略(elapsed=current−startelapsed = current - start),每次循环节省2条指令,提升约10%的循环效率。
3.3 支持硬件

Atlas 800I/T A2 训练系列产品、Atlas 800I/T A2 推理系列产品

3.4 算子约束限制
  1. 参数约束:cycles参数必须为int64_t类型,表示SYS_CNT硬件时钟周期数。负值或零值将被视为无延时。
  2. 精度约束:实际延时精度受循环开销影响,SCALE系数(约1/33)基于Ascend 910B3平台实测,不同硬件平台可能需要重新校准。
  3. 性能约束:忙等待策略会占用AI Core计算资源,不适合长时间延时(建议cycles < 1e9,即约600ms)。
  4. 硬件依赖:依赖SYS_CNT硬件计数器,仅支持Atlas 800I/T A2系列硬件。
  5. 单核执行:当前实现为单核执行(BlockDim=1),不支持多核并行。

备注(选填)

  • SYS_CNT频率:Ascend 910B3平台为1650 MHz,即每秒1.65e9次计数。
  • 墙钟时间计算:WallTime=cycles/1.65e9WallTime = cycles / 1.65e9 秒。
  • SCALE系数测量方法:运行已知cycles的kernel,通过GetSystemCycle()测量实际流逝的SYS_CNT ticks,计算比值 elapsed_ticks/user_cycles≈1/33elapsed\_ticks / user\_cycles \approx 1/33。
  • 与CUDA对比:语义类似CUDA的clock64()spin kernel,但使用硬件计数器而非软件定时器。

Origin(信息来源)

社区任务

Benefit / Necessity (价值/作用)

Design(设计方案)

likedislike
fangfangssjfangfangssj
6月15日 修改了issue 的描述
fangfangssj
fangfangssj
6月15日 评论:
oscillatedoscillated成员
6月15日 将 fullt 设为负责人
CANN-robotCANN-robot成员
6月23日 关闭了 issue
CANN-robotCANN-robot成员
6月23日 添加了label:resolved