同步内存复制
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考,示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import acl
# ......
# 1.申请内存。
size = 1 * 1024 * 1024
host_ptr_a, ret = acl.rt.malloc_host(size)
dev_ptr_b, ret = acl.rt.malloc(size, ACL_MEM_MALLOC_NORMAL_ONLY)
# 2.申请内存后,可向内存中读入数据,该自定义函数read_file由用户实现。
read_file(fileName, host_ptr_a, size)
# 3.同步内存复制。
# 同步内存复制,host_ptr_a表示Host上源内存地址的指针地址,dev_ptr_b表示Device上目的内存地址的指针地址,size表示内存大小。
# ACL_MEMCPY_HOST_TO_DEVICE = 1
ret = acl.rt.memcpy(dev_ptr_b, size, host_ptr_a, size, ACL_MEMCPY_HOST_TO_DEVICE)
# 4.使用完内存中的数据后,需及时释放资源。
ret = acl.rt.free_host(host_ptr_a)
ret = acl.rt.free(dev_ptr_b)
# ......
|
异步内存复制
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考,示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import acl
# ......
# 1.申请内存。
size = 1 * 1024 * 1024
# 异步内存复制要求,内存首地址64字节对齐,使用acl.rt.malloc_host需多申请64字节。
host_ptr_a, ret = acl.rt.malloc_host(size + 64)
# host申请的内存需要用户自己64对齐处理。
host_align = host_ptr_a + 64 - host_ptr_a % 64
# acl.rt.malloc 申请的Device 侧内存系统保证已经符合64对齐。
dev_ptr_b, ret = acl.rt.malloc(size, ACL_MEM_MALLOC_NORMAL_ONLY)
# 2.申请内存后,可向内存中读入数据,该自定义函数read_file由用户实现。
read_file(fileName, host_align, size)
# 3.异步内存复制。
# 异步内存复制,host_align表示Host上源内存地址的指针地址,dev_ptr_b表示Device上目的内存地址的指针地址,size表示内存大小。
# ACL_MEMCPY_HOST_TO_DEVICE = 1。
stream, ret = acl.rt.create_stream()
ret = acl.rt.memcpy_async(dev_ptr_b, size , host_align, size, ACL_MEMCPY_HOST_TO_DEVICE, stream)
ret = acl.rt.synchronize_stream(stream)
# 4.使用完内存中的数据后,需及时释放资源。
ret = acl.rt.destroy_stream(stream)
ret = acl.rt.free_host(host_ptr_a)
ret = acl.rt.free(dev_ptr_b)
# ......
|