已合并
fix: 修复 FFT 算子 host 侧缓冲区尺寸计算的整数溢出 #33
fix: 修复 FFT 算子 host 侧缓冲区尺寸计算的整数溢出 #33
已合并
Tian_1122创建于 12 天前
Tian_1122
Tian_1122成员
12 天前

当前PR是否有AI参与:

[x] 否

[ ] 是
__1. AI Agent 平台:
__2. AI 模型:
__3. Prompt上下文 :

PR功能描述 / 为什么需要这个合入**:

本 PR 修复 FFT 算子 host 侧缓冲区尺寸计算的整数溢出缺陷(9 处,8 文件,19±19 行)。

  • 问题:aclfftFft1DN / Fft1DStride / Fft1DB / Fft1DMix / Fft2DDd / Irfft1DC2RFft / Rfft1DR2CFft / Irfft1DFft 等函数将 inputSize / outputSize / workspaceSize 声明为 uint32_t。表达式 n * batches * sizeof(float) * 2 等左结合求值时,n*batches 先在 uint32_t 算术下溢出(>2^32 回绕),赋给 uint32_t 再截断一次。导致 aclrtMalloc 按截断后的小值分配设备内存,而 kernel 按 tiling 中真实 n/batches 写完整数据 → 设备内存越界(静默堆溢出 / 结果错乱)。
  • 修正原因:用库自身配置表支持的参数、经公开 API 即可触发。以 910B3(HBM 64GB)为例,tier3 n=16384 × batch=65536 真实输入缓冲 8GB(可存进 64GB),当前实现截断为 0 字节分配后 kernel 写 8GB → 必失败;多个支持档位(tier3 fftB/fftN、stride 路径 n=262144、R2C/C2R 大 batch、2D DD)均落入"4GB < 真实尺寸 ≤ 31GB"的"可行且必失败"范围。
  • 根因旁证:lib/fft_plan_init_api.cpp:43-50 已用 size_t 正确计算 plan->input_size,fft_handle_impl.h:35 亦存 size_t input_size —— 库本就按支持大尺寸设计,arch 函数用 uint32_t 重算是实现问题,应"进行size_t 改造让大尺寸能跑"而非"在 plan 加上界拒绝"。
  • 改法:变量 uint32_t → size_t(消赋值截断)+ 首操作数 static_cast<size_t>(n/batches)(强制乘法从第一步走 64 位)。只动随 n×batch 放大的 size 量,不碰 wMatrix/tMatrix/index/scratch 等固定量;常规尺寸(<4GB)行为不变。

该PR关联的issue

(格式为fixes #<issue号>, 或者resolves #<issue号>): fixes #
fixes #22
fixes #23
fixes #24
fixes #25
fixes #26
fixes #31
fixes #32
fixes #33
fixes #34

希望检视人员了解:

改动类型 / Change Type

测试信息 / Testing

检查清单 / Checklist

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 Tian_1122 的贡献)
Tian_1122Tian_1122成员
12 天前 创建了 pull request,commit 9c6f61eb
atomgit-bot
atomgit-bot
12 天前 评论:

变更摘要

本 PR 主要修复 FFT 系列算子 host 侧缓冲区尺寸计算中的整数溢出问题。原先 inputSizeoutputSizeworkspaceSize 等尺寸变量使用 uint32_t 保存,且在 n * batches * sizeof(float) * 2 这类连乘中先按 32 位整型计算,导致较大尺寸下发生溢出。此次改动将相关尺寸变量统一改为 size_t(个别改为 uint64_t),并在首个乘数上通过 static_cast<size_t>(...)static_cast<uint64_t>(...) 强制提升为 64 位运算,从而保证缓冲区尺寸计算正确。

主要改动

  • 一维 FFT 基础/混合/N 点算子尺寸计算提升为 64 位: 在 fft1_d_b.cppfft1_d_mix.cppfft1_d_n.cpp 中,将 inputSizeoutputSizeuint32_t 改为 size_t,并用 static_cast<size_t>(n) * batches * sizeof(float) * 2 避免中间结果溢出。
  • 带 stride 的一维 FFT 算子扩大 workspace 尺寸类型: 在 fft1_d_stride.cpp 中,除 inputSizeoutputSize 外,还将 kernelWorkspaceSizetotalWorkspaceSize 改为 size_t,并对 n 使用 static_cast<size_t>(...)
  • 二维 FFT 算子 workspace 尺寸改为 uint64_t: 在 fft2_d_dd.cpp 中,inputSizeoutputSize 改为 size_tworkspaceSize 改为 uint64_t 并通过 static_cast<uint64_t>(batches) 强制 64 位计算。
  • 实数/逆实数 FFT 算子缓冲区尺寸改为 size_t: 在 rfft1_d_r2c_fft.cppirfft1_d_c2r_fft.cppirfft1_d_fft.cpp 中,将 inputSizeoutputSizeworkspaceSize 改为 size_t,并对 nbatches 使用 static_cast<size_t>(...) 防止 32 位溢出。
likedislike
atomgit-bot
atomgit-bot
12 天前 评论:

代码审查

✅ 未发现问题

likedislike
CANN-robotCANN-robot成员
12 天前 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
12 天前 评论:

CLA Signature Pass

Tian_1122, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
CANN-robot
CANN-robot成员
12 天前 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
For more, you also can visit HICANN.


PR Approval Progress

Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
repo-cann/ops-fft 张浩, east_yang (2/2) 张浩, east_yang (2/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)
likedislike
Tian_1122Tian_1122成员
12 天前 修改了pull request 的描述
此处折叠了19条事件消息 查看更多
CANN-robotCANN-robot成员
12 天前 添加了label:cann-cla/yes
Tian_1122
Tian_1122成员
12 天前 评论:

compile

likedislike
CANN-robotCANN-robot成员
12 天前 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
12 天前 评论:

流水线任务触发成功
任务链接 [878a2497ee164fb2aecc850e7bc9fdb7][流水线指导]

任务名称状态日志下载链接
Compile_Ascend_X86 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM ✅ SUCCESS >>>>> >>>>>
codecheck ✅ SUCCESS >>>>>
SCA ✅ SUCCESS >>>>>
antipoison ✅ SUCCESS >>>>>
Check_Pr ✅ SUCCESS >>>>>
pre_comment ✅ SUCCESS >>>>>
Compile_Ascend_X86_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM_ubuntu24 ✅ SUCCESS >>>>> >>>>>
precommit ✅ SUCCESS >>>>>
codecheck_codestyle ✅ SUCCESS >>>>>

[2026-08-17 16:32:52]    CI执行结束

likedislike
CANN-robotCANN-robot成员
12 天前 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
12 天前 添加了label:ci-pipeline-passed
demoauguste成员
12 天前 评论:

/lgtm
/approve

likedislike
CANN-robotCANN-robot成员
12 天前 添加了label:approved
east_yang成员
12 天前 评论:

/lgtm
/approve

likedislike
CANN-robotCANN-robot成员
12 天前 添加了label:lgtm
CANN-robotCANN-robot成员
12 天前 关闭了关联的issue
CANN-robotCANN-robot成员
12 天前 合入了pull request