本特性提供了跨进程共享Buffer管理能力,可配合共享队列一起使用。共享Buffer的共享范围由共享队列的授权确定,共享范围包括“一主多从”的这些进程。
关键接口的调用流程如上图所示,流程说明如下:
调用aclInit接口实现初始化AscendCL。
具体流程,请参见运行管理资源申请与释放。
调用acltdtAllocBuf接口申请共享Buffer内存,此处需根据实际情况选择内存类型。
需先调用acltdtGetBufData接口获取共享Buffer的数据区指针和数据区长度,接着调用aclrtMemcpy接口把用户数据复制到共享Buffer中,最后可调用acltdtSetBufDataLen接口设置有效数据长度,以便在多进程场景下调用acltdtGetBufDataLen接口获取有效数据长度,再根据有效数据长度获取共享Buffer中的数据。
调用acltdtSetBufUserData接口设置共享Buffer的私有数据区数据,以便在多进程场景下调用acltdtGetBufUserData接口获取共享Buffer的私有数据区数据。
调用acltdtFreeBuf接口来释放共享Buffer。
接口调用流程,请参见运行管理资源申请与释放。
调用aclFinalize接口实现AscendCL去初始化。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。
#include "acl/acl.h" // 1. AscendCL初始化 // 此处的..表示相对路径,相对可执行文件所在的目录 // 例如,编译出来的可执行文件存放在out目录下,此处的..就表示out目录的上一级目录 const char *aclConfigPath = "../src/acl.json"; aclError ret = aclInit(aclConfigPath); // 2. 运行管理资源申请,指定计算设备,此处以deviceId = 0为例 ret = aclrtSetDevice(0); // 3. 申请mbuf内存并进行内存管理,此处以申请DVPP内存、内存大小1024U为例 size_t size = 1024U; acltdtBuf buf; ret = acltdtAllocBuf(size, ACL_TDT_DVPP_MEM, &buf); // 4. 向共享Buffer中填充有效数据 // 4.1 获取共享Buffer的数据区指针和数据区长度 void *dataPtr = nullptr; size_t dataSize = 0U; ret = acltdtGetBufData(buf, &dataPtr, &dataSize); // 4.2 把用户数据拷贝到共享Buffer中 size_t len = 512U; // 用户数据长度 void *ptr = new (std::nothrow) char_t[len]; // 用户申请自己的内存 // 用户对自己申请的数据进行处理 //…… ret = aclrtMemcpy(dataPtr, size, ptr, len, ACL_MEMCPY_HOST_TO_DEVICE); // 5. 释放内存 delete[] ptr; ptr = nullptr; delete[] newPtr; newPtr = nullptr; ret = acltdtFreeBuf(buf); // 6. 运行管理资源释放 ret = aclrtResetDevice(0); // 7. AscendCL去初始化 ret = aclFinalize();