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