共享Buffer管理

本特性提供了跨进程共享Buffer管理能力,可配合共享队列一起使用。共享Buffer的共享范围由共享队列的授权确定,共享范围包括“一主多从”的这些进程。

接口调用流程

关键接口的调用流程如上图所示,流程说明如下:

  1. AscendCL初始化。

    调用aclInit接口实现初始化AscendCL。

  2. 运行管理资源申请。

    具体流程,请参见运行管理资源申请与释放

  3. 申请共享Buffer内存。

    调用acltdtAllocBuf接口申请共享Buffer内存,此处需根据实际情况选择内存类型。

  4. 向共享Buffer中填充有效数据。

    需先调用acltdtGetBufData接口获取共享Buffer的数据区指针和数据区长度,接着调用aclrtMemcpy接口把用户数据复制到共享Buffer中,最后可调用acltdtSetBufDataLen接口设置有效数据长度,以便在多进程场景下调用acltdtGetBufDataLen接口获取有效数据长度,再根据有效数据长度获取共享Buffer中的数据。

  5. 设置共享Buffer的私有数据区数据。

    调用acltdtSetBufUserData接口设置共享Buffer的私有数据区数据,以便在多进程场景下调用acltdtGetBufUserData接口获取共享Buffer的私有数据区数据。

  6. 释放共享Buffer内存。

    调用acltdtFreeBuf接口来释放共享Buffer。

  7. 运行管理资源释放。

    接口调用流程,请参见运行管理资源申请与释放

  8. AscendCL去初始化。

    调用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();