已关闭
random_num_task 样例未初始化 randomCounterAddr,导致随机数结果受 Device 内存历史数据影响 #827
Louise创建于 24 天前关闭于 8 天前
ykl999
24 天前 评论:
24 天前 评论:
你好,问题已收到。我们会根据issue核查example代码


ykl999
24 天前 评论:
24 天前 评论:
/assign @m0_60337577


24 天前 将 m0_60337577 设为负责人
22 天前 关联了pull request:fix: 初始化random_num_task样例counter(#827)
jiaxingru
22 天前 评论:
22 天前 评论:
您好,经核查,该问题属实。
aclrtMalloc 不保证初始化所分配的 Device 内存,而 randomCounterAddr 用于保存随机数任务的 128 位 counter/偏移量。当前样例申请 counter 内存后未写入初始值,首个随机数任务可能读取到 Device 内存中的历史数据,后续复用该 counter 的任务也会受到影响。
已提交修复 PR:#4295
本次修改在首个随机数任务执行前,通过 aclrtMemset 将 16 字节 counter 初始化为 0。后续任务继续共享并推进同一 counter,保持样例原有状态管理方式不变。
修复已通过代码格式检查、C++ 语法检查、CMake 构建和 Ascend 实机运行验证。相同 seed=0 下多次运行,五组随机数输出逐项一致,程序均执行成功。
感谢反馈。


22 天前 添加了label:wait-feedback
CANN-robot
15 天前 评论:
15 天前 评论:
您好,为了更准确地定位和解决问题,我们需要您提供上述提到的相关信息。如果 14 天内没有进一步更新,我们将暂时关闭此 Issue。感谢您的理解与配合。


8 天前 添加了label:resolved
一、问题现象
样例路径:
example/2_advanced_features/built_in_task/1_random_num_task
该样例申请用于保存随机数状态的 Device 内存后,没有写入初始偏移量,随后直接将其作为
randomCounterAddr 传给随机数任务。
例如,在执行原样例前插入一次 Device 内存申请、写入和释放:
随后继续执行原样例,相同 seed 下生成的随机数序列可能发生变化。结果会受到新申请 Device
内存中历史数据的影响。
二、问题分析
当前样例中的相关代码为:
counterAddr 分配后未调用 aclrtMemset,也未通过 Host-to-Device 拷贝写入明确的初始偏移量。
公开接口文档对 randomCounterAddr 的说明为:
生成随机数的偏移量。由用户提前申请 Device 内存,读入偏移量数据后,再将内存地址作为参数传入。
aclrtMalloc 只负责分配 Device 内存,不保证返回内存的初始内容为零。因此,样例不能将未初始化的
Device 内存直接作为随机数状态输入。
当前样例实际使用同一个未初始化的 counterAddr 依次执行:
NormalFloatAsync
NormalBF16Async
UniformFloat16Async
UniformInt32Async
DropoutBitmask
首个随机数任务读取到的初始 counter 不确定,后续任务的随机数状态也会受到影响。
三、实际验证
在相同 seed=0 的条件下:
counterAddr 未初始化时,不同 Runtime 环境生成的随机数结果不同;
每套环境内部重复执行时,结果各自保持稳定;
将 16 字节 counterAddr 显式清零后,两套 Runtime 打印的随机数结果逐项一致。
这说明结果差异来自 randomCounterAddr 的初始内容,而不是 seed 参数本身。
四、修改建议
在执行第一个随机数任务前,为 counterAddr 写入明确的初始偏移量。
如果样例期望从偏移量 0 开始,可修改为:
如果随机数协议要求特定的 128 位初始偏移量,则应构造对应的 Host 数据,并通过 aclrtMemcpy
完整写入 16 字节 Device 内存。