从Device到Host的数据传输
同步内存复制
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考,示例代码如下:
import acl # ...... # 1.申请内存。 size = 1 * 1024 * 1024 host_ptr_b, ret = acl.rt.malloc_host(size) dev_ptr_a, ret = acl.rt.malloc(size, ACL_MEM_MALLOC_NORMAL_ONLY) # 2.申请内存后,可向内存中读入数据,该自定义函数read_file由用户实现。 read_file(fileName, dev_ptr_a, size) # 3.同步内存复制。 # 同步内存复制,dev_ptr_a表示Device上源内存地址的指针地址,host_ptr_b表示Host上目的内存地址的指针地址,size表示内存大小。 # ACL_MEMCPY_DEVICE_TO_HOST = 2。 ret = acl.rt.memcpy(host_ptr_b, size, dev_ptr_a, size, ACL_MEMCPY_DEVICE_TO_HOST) # 4.使用完内存中的数据后,需及时释放资源。 ret = acl.rt.free_host(host_ptr_b) ret = acl.rt.free(dev_ptr_a) # ......
异步内存复制
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考,示例代码如下:
import acl # ...... # 1.申请内存。 size = 1 * 1024 * 1024 # acl.rt.malloc 申请的Device侧内存系统保证已经符合64对齐。 dev_ptr_a, ret = acl.rt.malloc(size, ACL_MEM_MALLOC_NORMAL_ONLY) # 异步内存复制要求,内存首地址64字节对齐,使用acl.rt.malloc_host 需多申请64字节。 host_ptr_b, ret = acl.rt.malloc_host(size + 64) # host申请的内存需要用户自己64对齐处理。 host_align = host_ptr_b+ 64 - host_ptr_b % 64 # 2.申请内存后,可向内存中读入数据,该自定义函数read_file由用户实现。 read_file(fileName, dev_ptr_a, size) # 3.异步内存复制。 # 异步内存复制,dev_ptr_a表示Device上源内存地址的指针地址,host_align 表示Host上目的内存地址的指针地址,size表示内存大小。 # ACL_MEMCPY_DEVICE_TO_HOST = 2。 stream = acl.rt_create_stream() ret = acl.rt.memcpy_async(host_align, size , dev_ptr_a, size, ACL_MEMCPY_DEVICE_TO_HOST, stream) ret = acl.rt.synchronize_stream(stream) # 4.使用完内存中的数据后,需及时释放资源。 ret = acl.rt.destroy_stream(stream) ret = acl.rt.free_host(host_ptr_b) ret = acl.rt.free(dev_ptr_a) # ......
父主题: 数据传输