已关闭
random_num_task 样例未初始化 randomCounterAddr,导致随机数结果受 Device 内存历史数据影响 #827
Louise创建于  24 天前关闭于  8 天前
Louise
24 天前 创建

一、问题现象
样例路径:

example/2_advanced_features/built_in_task/1_random_num_task

该样例申请用于保存随机数状态的 Device 内存后,没有写入初始偏移量,随后直接将其作为
randomCounterAddr 传给随机数任务。

例如,在执行原样例前插入一次 Device 内存申请、写入和释放:

void* tmpDevice = nullptr;
uint64_t counterData[2] = {
    0x123456789ABCDEF0ULL,
    0x0FEDCBA987654321ULL
};

CHECK_ERROR(aclrtMalloc(&tmpDevice, sizeof(counterData),
    ACL_MEM_MALLOC_HUGE_FIRST));
CHECK_ERROR(aclrtMemcpy(tmpDevice, sizeof(counterData),
    counterData, sizeof(counterData), ACL_MEMCPY_HOST_TO_DEVICE));
CHECK_ERROR(aclrtFree(tmpDevice));

随后继续执行原样例,相同 seed 下生成的随机数序列可能发生变化。结果会受到新申请 Device
内存中历史数据的影响。

二、问题分析
当前样例中的相关代码为:

void* counterAddr = NULL;
CHECK_ERROR(aclrtMalloc(
    reinterpret_cast<void**>(&counterAddr),
    16,
    ACL_MEM_MALLOC_HUGE_FIRST));

CHECK_ERROR(NormalFloatAsync(
    mean, stddev, false, seed, num,
    counterAddr, devOutput, stream));

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 开始,可修改为:

void* counterAddr = nullptr;
constexpr size_t counterSize = 16U;

CHECK_ERROR(aclrtMalloc(
    &counterAddr,
    counterSize,
    ACL_MEM_MALLOC_HUGE_FIRST));
CHECK_ERROR(aclrtMemset(
    counterAddr,
    counterSize,
    0,
    counterSize));

如果随机数协议要求特定的 128 位初始偏移量,则应构造对应的 Host 数据,并通过 aclrtMemcpy
完整写入 16 字节 Device 内存。

likedislike
ykl999
ykl999成员
24 天前 评论:

你好,问题已收到。我们会根据issue核查example代码

likedislike
ykl999
ykl999成员
24 天前 评论:

/assign @m0_60337577

likedislike
CANN-robotCANN-robot成员
24 天前 将 m0_60337577 设为负责人
jiaxingrujiaxingru成员
22 天前 关联了pull request:fix: 初始化random_num_task样例counter(#827)
jiaxingru
jiaxingru成员
22 天前 评论:

您好,经核查,该问题属实。

aclrtMalloc 不保证初始化所分配的 Device 内存,而 randomCounterAddr 用于保存随机数任务的 128 位 counter/偏移量。当前样例申请 counter 内存后未写入初始值,首个随机数任务可能读取到 Device 内存中的历史数据,后续复用该 counter 的任务也会受到影响。

已提交修复 PR:#4295

本次修改在首个随机数任务执行前,通过 aclrtMemset 将 16 字节 counter 初始化为 0。后续任务继续共享并推进同一 counter,保持样例原有状态管理方式不变。

修复已通过代码格式检查、C++ 语法检查、CMake 构建和 Ascend 实机运行验证。相同 seed=0 下多次运行,五组随机数输出逐项一致,程序均执行成功。

感谢反馈。

likedislike
jiaxingrujiaxingru成员
22 天前 添加了label:wait-feedback
CANN-robot
CANN-robot成员
15 天前 评论:

您好,为了更准确地定位和解决问题,我们需要您提供上述提到的相关信息。如果 14 天内没有进一步更新,我们将暂时关闭此 Issue。感谢您的理解与配合。

likedislike
LLouise
8 天前 issue状态由 待办的 改变为 已解决
LLouise
8 天前 关闭了 issue
CANN-robotCANN-robot成员
8 天前 添加了label:resolved