交替地添加异步拷贝任务(acl.rt.memcpy_async)和异步模型执行任务(asl.mdl.execute_async)后 stream 是否还能够包序执行任务?
收藏回复举报
交替地添加异步拷贝任务(acl.rt.memcpy_async)和异步模型执行任务(asl.mdl.execute_async)后 stream 是否还能够包序执行任务?
t('forum.solved') 已解决
新人帖
发表于2026-04-15 15:13:16
0 查看

如果向默认stream(stream参数填0)以此序列添加任务: memcpy_async(batches[i]) -> execute_async(batches[i]) -> memcpy_async(batches[i+1]) -> execute_async(batches[i+1]),那么stream能够保序执行吗?即 stream 能够保证一个batch的数据拷贝任务执行完毕了才执行对应的模型执行任务吗?我在实验的过程中发现这种方式无法保证输出结果的正确性,似乎拷贝任务和模型执行任务相互干扰。

我的环境:

  • 硬件:Altas 200i pro (310p), 32G 同一内存
  • OS: openEuler 22.03 LTS
  • CANN 版本:8.0.0.alpha003

应用逻辑伪码:

def process(x):
    ret = acl.set_device(0)
    n_samples = x.shape[0]
    batch_size = 2 ** 20
    n_batch = n_samples // batch_size
    n_batch = n_batch + 1 if n_samples % batch_size > 0 else n_batch

    for i in range(n_batch):
        start = i * batch_size
        end = min(start + batch_size, n_samples)
        roi_host = slice(start, end)
        x_batch_data = x[roi_host].to_bytes()
        x_batch_data_ptr = x[roi_host].ctype.data
        n_bytes = len()

        # prepare in/out dataset
        in_dev_ptr, ret = acl.rt.malloc(n_bytes)
        out_dev_ptr, ret = acl.rt.malloc(n_bytes)
        host_ptr, ret = acl.rt.malloc_host(n_bytes)
        in_buffer = acl.rt.create_buffer(in_dev_ptr, n_bytes)
        out_buffer = acl.rt.create_buffer(out_dev_ptr, n_bytes)
        in_dataset = acl.mdl.create_dataset()
        out_dataset = acl.mdl.create_dataset()
        _, ret = acl.mdl.add_dataset_buffer(in_dataset, in_buffer)
        _, ret = acl.mdl.add_dataset_buffer(out_dataset, out_buffer)
        
        # fill data into in_dataset
        ret = acl.rt.memcpy_async(
            in_dev_ptr[i],
            n_bytes,
            x_batch_data_ptr,
            n_bytes,
            HOST_TO_DEVICE,
            0
        )
        
        ret = acl.mdl.execute_async(model_id, in_dataset, out_dataset, 0)
        
        # get result from out_dataset
        ...

我要发帖子