辅助接口
数据获取接口(C++语言)
通过以下辅助接口可以获取相关参数。数据获取的接口大部分为C语言与C++通用的接口,C++专用的接口在函数格式中进行了说明。
获取Device数目
获取device个数。该接口在c_graph.h中定义。
函数格式
HIAI_StatusT HIAI_GetDeviceNum(uint32_t *devCount);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
devCount |
输出device个数的指针。 |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码
序号 |
错误码级别 |
错误码 |
错误码描述 |
---|---|---|---|
1 |
HIAI_INFO |
HIAI_OK |
running ok |
2 |
HIAI_ERROR |
HIAI_GRAPH_GET_DEVNUM_ERROR |
get device number error |
调用示例
uint32_t dev_count; HIAI_GetDeviceNum(&dev_count);
获取第一个DeviceID
获取第一个device的id。该接口在c_graph.h中定义。
函数格式
HIAI_StatusT HIAI_GetFirstDeviceId(uint32_t *firstDevID);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
firstDevID |
第一个device的id的指针。 |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码
序号 |
错误码级别 |
错误码 |
错误码描述 |
---|---|---|---|
1 |
HIAI_INFO |
HIAI_OK |
running ok |
2 |
HIAI_ERROR |
HIAI_GRAPH_GET_DEVID_ERROR |
get device id error |
调用示例
uint32_t first_dev_id; HIAI_GetFirstDeviceId(&first_dev_id);
获取第一个GraphID
获取GraphID。该接口在c_graph.h中定义。
函数格式
C语言与C++通用接口:HIAI_StatusT HIAI_GetFirstGraphId(uint32_t *firstGraphID);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
firstGraphID |
第一个graph的id指针。 |
- |
返回值
C语言与C++通用接口:错误码。
错误码
序号 |
错误码级别 |
错误码 |
错误码描述 |
---|---|---|---|
1 |
HIAI_INFO |
HIAI_OK |
running ok |
2 |
HIAI_ERROR |
HIAI_GRAPH_GET_GRAPHID_ERROR |
get graph id error |
调用示例
uint32_t first_graph_id; HIAI_GetFirstGraphId(&first_graph_id);
获取下一个DeviceID
获取下一个device的id。该接口在c_graph.h中定义。
函数格式
HIAI_StatusT HIAI_GetNextDeviceId(const uint32_t curDevID,uint32_t *nextDevID);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
curDevID |
当前device的id号。 |
- |
nextDevID |
下一个device的id号的指针。 |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码
序号 |
错误码级别 |
错误码 |
错误码描述 |
---|---|---|---|
1 |
HIAI_INFO |
HIAI_OK |
running ok |
2 |
HIAI_ERROR |
HIAI_GRAPH_GET_DEVID_ERROR |
get device id error |
调用示例
uint32_t cur_dev_id = 1; uint32_t next_dev_id; HIAI_GetNextDeviceId(cur_dev_id, &next_dev_id);
获取下一个GraphID
获取下一个GraphID。该接口在c_graph.h中定义。
函数格式
C语言与C++通用接口:HIAI_StatusT HIAI_GetNextGraphId(const uint32_t curGraphID,uint32_t *nextGraphID);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
curGraphID |
当前graph id。 |
- |
nextGraphID |
下一个graph的id指针。 |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码
序号 |
错误码级别 |
错误码 |
错误码描述 |
---|---|---|---|
1 |
HIAI_INFO |
HIAI_OK |
running ok |
2 |
HIAI_ERROR |
HIAI_GRAPH_GET_GRAPHID_ERROR |
get graph id error |
调用示例
uint32_t cur_graph_id = 1; uint32_t next_graph_id; HIAI_GetNextGraphId(cur_graph_id, &next_graph_id);
获取Engine指针
根据engineID查找Engine对象指针。该接口在graph.h中定义。
函数格式
std::shared_ptr<Engine> Graph::GetEngine(uint32_t engineID);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
engineID |
目标Engine的id |
- |
返回值
Engine的智能指针。
调用示例
uint32_t engineID= 1000; auto graphPtr = Graph::GetInstance(100); auto enginePtr = graphPtr->GetEngine(engineID);
获取Graph的DeviceID
获取当前graph在device侧的id。该接口在graph.h中定义。
函数格式
uint32_t Graph::GetDeviceID();
返回值
当前graph在device侧的id。
调用示例
auto graphPtr = Graph::GetInstance(100); auto deviceId = graphPtr->GetDeviceID();
获取Engine的GraphId
获取Engine的GraphId。该接口在engine.h中定义。
函数格式
uint32_t Engine::GetGraphId();
返回值
Engine的GraphId。
调用示例
uint32_t engineID= 1000; auto graphPtr = Graph::GetInstance(100); auto enginePtr = graphPtr->GetEngine(engineID); auto graphID= enginePtr->GetGraphId();
获取Engine队列最大大小
获取Engine的Queue最大Size。该接口在engine.h中定义。
函数格式
const uint32_t Engine::GetQueueMaxSize();
返回值
该Engine的Queue最大Size。
调用示例
uint32_t engineID= 1000; auto graphPtr = Graph::GetInstance(100); auto enginePtr = graphPtr->GetEngine(engineID); auto engineQueueSize = enginePtr->GetQueueMaxSize();
获取Engine指定端口当前队列大小
获取Engine的某端口号Queue的Size。该接口在engine.h中定义。
函数格式
const uint32_t Engine::GetQueueCurrentSize(const uint32_t portID);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
portID |
端口号 |
- |
返回值
该Engine的portID端口号Queue的Size。
调用示例
uint32_t engineID= 1000; uint32_t portID = 0; auto graphPtr = Graph::GetInstance(100); auto enginePtr = graphPtr->GetEngine(engineID); auto engineQueueSize = enginePtr->GetQueueCurrentSize(portID);
解析Matrix配置文件
解析配置文件。Matrix解析配置文件,并将生成的Graph回写到list中,供用户使用。该接口在graph.h中定义。
函数格式
static HIAI_StatusT Graph::ParseConfigFile(const std::string& configFile, GraphConfigList& graphConfigList)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
configFile |
配置文件路径。 请确保传入的文件路径是正确路径。 |
- |
graphConfigList |
Protobuf数据格式。 |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码
序号 |
错误码级别 |
错误码 |
错误码描述 |
---|---|---|---|
1 |
- |
HIAI_GRAPH_GET_INSTANCE_NULL |
- |
获取PCIe的Info
获取PCIe(Peripheral Component Interconnect Express)的信息。该接口在c_graph.h中定义。
函数格式
static HIAI_StatusT HIAI_GetPCIeInfo(const uint32_t devId,int32_t* bus, int32_t* dev, int32_t* func);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
devId |
需要查询的devId |
- |
bus |
返回PCIe总线号 |
- |
dev |
返回PCIe设备号 |
- |
func |
返回PCIe功能号 |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码
序号 |
错误码级别 |
错误码 |
错误码描述 |
---|---|---|---|
1 |
HIAI_INFO |
HIAI_OK |
running ok |
2 |
HIAI_ERROR |
HIAI_GRAPH_GET_PCIEINFO_ERROR |
bus,dev,func中有空指针,或者get pcie info error |
调用示例
uint32_t devId= 1; uint32_t bus; uint32_t dev; uint32_t func; HIAI_GetPCIeInfo(devId, &bus, &dev, &func);
获取版本号
获取API版本信息。该接口在c_graph.h中定义。
函数格式
HIAI_API_VERSION HIAI_GetAPIVersion();
返回值
版本信息的enum信息。
调用示例
HIAI_API_VERSION HIAI_GetAPIVersion();
获取OamConfig智能指针
获取OamConfig智能指针,用于获取oam配置信息,包括模型名称、是否打开Dump开关、需要Dump模型中哪些层的算子信息。该接口在engine.h文件中定义。
函数格式
OAMConfigDef* GetOamConfig();
参数说明
无。
返回值
OamConfig智能指针。OAMConfigDef类型的定义请参见Protobuffer数据类型。
数据类型序列化和反序列化(C++语言)
为用户自定义的各种数据类型提供自动化序列化和反序列化机制。
其中相关宏封装用到了以下接口:
static HIAIDataTypeFactory* HIAIDataTypeFactory::GetInstance();
宏:HIAI_REGISTER_DATA_TYPE
为用户自定义的数据结构类型提供自动化序列化和反序列化机制。该宏在data_type_reg.h中定义。
- 该接口需要在host和Device端同时注册。
- 因为cereal的限制, 结构体中应避免使用long double类型,为了保证跨平台(如Windows到Linux)运行, 结构体成员尽量使用可移植的类型,如 int32_t等;
- 因为cereal的限制, 结构体中需使用共享指针。
函数格式
HIAI_REGISTER_DATA_TYPE(name, type)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
name |
用户自定义的数据结构类型名字(不同的数据类型要保证名字唯一)。 |
- |
type |
用户自定义的数据结构类型。 |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码示例
序号 |
错误码 |
错误码描述 |
---|---|---|
1 |
HIAI_OK |
running ok |
2 |
HIAI_ENGINE_FUNCTOR_NULL |
hiai engine function is null |
3 |
HIAI_ENGINE_FUNCTOR_EXIST |
hiai engine function is existed |
宏:HIAI_REGISTER_TEMPLATE_DATA_TYPE
为用户自定义的模板的数据结构类型提供自动化序列化和反序列化机制。该宏在data_type_reg.h中定义。
该接口需要在host和Device端同时注册该类。
函数格式
HIAI_REGISTER_TEMPLATE_DATA_TYPE(name, type, basictype1, basictype2, …)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
name |
用户自定义的数据结构类型名字(不同的数据结构类型要保证名字唯一)。 |
- |
type |
用户自定义的模板的数据结构类型。 |
- |
basicType1 |
用户自定义的数据类型。 |
- |
basicType2 |
用户自定义的数据类型。 |
- |
... |
... |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码示例
序号 |
错误码 |
错误码描述 |
---|---|---|
1 |
HIAI_OK |
running ok |
2 |
HIAI_ENGINE_FUNCTOR_NULL |
hiai engine function is null |
3 |
HIAI_ENGINE_FUNCTOR_EXIST |
hiai engine function is existed |
宏:HIAI_REGISTER_SERIALIZE_FUNC
为用户自定义的数据类型提供自定义的序列化和反序列化机制。该宏在data_type_reg.h中定义。
即发送时将用户传输的结构体指针转化为结构体buffer和数据buffer,接受数据时,将从框架获取的结构体buffer和数据buffer反转为结构体。
使用场景:
用于从host侧到Device侧快速搬运数据,如果用户需要提升传输性能,必须使用该接口注册函数。
- 该接口用于从host侧到Device侧快速搬运数据使用。
- 如果用户想使用高性能传输接口,必须使用该注册函数注册序列化和反序列化函数。
函数格式
HIAI_REGISTER_SERIALIZE_FUNC(name, type, hiaiSerializeFunc, hiaiDeSerializeFunc)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
name |
注册的消息名字。 |
- |
type |
自定义数据结构的类型。 |
- |
hiaiSerializeFunc |
序列化函数。函数形式为 typedef void(*hiaiSerializeFunc)(void* inputPtr, std::string& ctrlStr, uint8_t*& dataPtr, uint32_t& dataLen); 各参数说明如下:
|
- |
hiaiDeSerializeFunc |
反序列化函数。函数形式为 typedef std::shared_ptr<void>(*hiaiDeSerializeFunc)( const char* ctrlPtr, const uint32_t& ctrlLen, const uint8_t* dataPtr, const uint32_t& dataLen); 各参数说明如下:
|
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码示例
序号 |
错误码 |
错误码描述 |
---|---|---|
1 |
HIAI_OK |
running ok |
2 |
HIAI_ENGINE_FUNCTOR_NULL |
hiai engine function is null |
3 |
HIAI_ENGINE_FUNCTOR_EXIST |
hiai engine function is existed |
Graph::ReleaseDataBuffer
在数据进行反序列化过程中,数据内存赋值给智能指针时,将本函数注册为删除器。该接口在graph.h中定义。
函数格式
static void Graph::ReleaseDataBuffer(void* ptr)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
ptr |
内存指针 |
- |
接口使用示例
/*************************************************************************************** * CopyRight (C) Hisilicon Co., Ltd. * * Filename: user_def_datatype.h * Description: User defined data type * * Version: 1.0 * Created: 2018-01-08 10:15:18 * Author: * * Revision: initial draft; **************************************************************************************/ #ifndef USE_DEF_DATA_TYPE_H_ #define USE_DEF_DATA_TYPE_H_ #ifdef __cplusplus #include <vector> #include <map> #endif // 用户自定义的数据类型 (C 语言风格) typedef struct UseDefDataType { int data1; float data2; }UseDefDataTypeT; #ifdef __cplusplus // 用户自定义的数据类型 (带模板类型) template<typename T1, typename T2, typename T3> class UseDefTemplateDataType { public: std::vector<T1> data_vec_; std::map<T2, T3> data_map_; }; #endif #endif
/*************************************************************************************** * CopyRight (C) Hisilicon Co., Ltd. * * Filename: use_def_data_type_reg.cpp * Description: User defined Data Type Register * * Version: 1.0 * Created: 2018-01-08 10:15:18 * Author: h00384043 * * Revision: initial draft; **************************************************************************************/ #include "use_def_data_type.h" #include "hiaiengine/data_type_reg.h" // 用户自定义的数据类型必须先注册到Matrix,才能作为Engine之间的通信接口正常使用 template<class Archive> void serialize(Archive& ar, UseDefDataTypeT& data) { ar(data.data1, data.data2); } // 注册UseDefDataTypeT HIAI_REGISTER_DATA_TYPE("UseDefDataTypeT", UseDefDataTypeT) // 模板类型数据的注册 // 对于模板类型,对于所有需要使用的类型必须都注册 template<class Archive, typename T1, typename T2, typename T3> void serialize(Archive& ar, UseDefTemplateDataType<T1, T2, T3>& data) { ar(data.data_vec_, data.data_map_); } // 注册 UseDefTemplateDataType<int, float> HIAI_REGISTER_TEMPLATE_DATA_TYPE("UseDefTemplateDataType_uint64_t_float_string", UseDefTemplateDataType, uint64_t, float, std::string); //... 注册其他类型 // 注册 UseDefTemplateDataType<int, int> HIAI_REGISTER_TEMPLATE_DATA_TYPE("UseDefTemplateDataType_uint64_t_uint64_t_uint64_t", UseDefTemplateDataType, uint64_t, uint64_t, uint64_t);
// 注册结构体的序列化和反序列化 typedef struct tagST_SC_IMAGE { INT32 iWidth; // image width INT32 iHeight; // image height INT32 iWidthStep; // Size of aligned image row in bytes INT32 iChannel; // channels INT32 iDepth; // depth in bits UINT32 uiTimeStampH; UINT32 uiTimeStampL; UINT32 iSize; UINT64 uiID; EN_SC_IMAGE_TYPE eType; // image type ST_SC_IMAGE_ROI *roi; // Image ROI. If NULL, the whole image is selected UINT8* pucImageData; // Image data UINT64 uiPhyAddr; }ST_SC_IMAGE; std::shared_ptr<ST_SC_IMAGE> st_image = std::make_shared<ST_SC_IMAGE>(); st_image->iWidth = 1080; st_image->iHeight = 1080; st_image->iChannel = 1; st_image->iWidthStep = 1080; st_image->iSize = 1080*1080*3/2 ; st_image->eType = SC_IMAGE_YUV420SP; st_image->roi = (ST_SC_IMAGE_ROI*)malloc(sizeof(ST_SC_IMAGE_ROI)); st_image->pucImageData = nullptr; uint8_t* align_buffer = nullptr; HIAI_StatusT get_ret = HIAIMemory::HIAI_DMalloc(st_image->iSize,(void*&)align_buffer,10000); hiai::EnginePortID engine_id; engine_id.graph_id = 1; engine_id.engine_id = 1; engine_id.port_id = 0; HIAI_SendData(engine_id, "ST_SC_IMAGE", std::static_pointer_cast<void>(st_image),100000); void GetStScImageSearPtr(void* inputPtr, std::string& ctrlStr, uint8_t*& dataPtr, uint32_t& dataLen) { // 如果结构体内有除了image之外的多个指针, 则进行拼接 ST_SC_IMAGE* st_image = (ST_SC_IMAGE*)inputPtr; ctrlStr = std::string((char*)inputPtr, sizeof(ST_SC_IMAGE)); if(nullptr != st_image->roi) { std::string image_roi_str = std::string((char*)st_image->roi, sizeof(ST_SC_IMAGE_ROI)); ctrlStr += image_roi_str; } dataPtr = (UINT8*)st_image->pucImageData; dataLen= st_image->iSize; } std::shared_ptr<void> GetStScImageDearPtr(const char* ctrlPtr, const uint32_t& ctrlLen, const uint8_t* dataPtr, const uint32_t& dataLen) { ST_SC_IMAGE* st_sc_image = (ST_SC_IMAGE*)ctrlPtr; std::shared_ptr<hiai::BatchImagePara<uint8_t>> ImageInfo(new hiai::BatchImagePara<uint8_t>); hiai::ImageData<uint8_t> image_data; image_data.width = st_sc_image->iWidth; image_data.height = st_sc_image->iHeight; image_data.channel = st_sc_image->iChannel; image_data.width_step = st_sc_image->iWidthStep; if (st_sc_image->eType == SC_IMAGE_U8C3PLANAR) { image_data.size = st_sc_image->iWidth * st_sc_image->iHeight * 3; image_data.format = hiai::BGR888; } else if (SC_IMAGE_U8C3PACKAGE == st_sc_image->eType) { image_data.size = st_sc_image->iWidth * st_sc_image->iHeight * 3; image_data.format = hiai::BGR888; } else if (st_sc_image->eType == SC_IMAGE_YUV420SP) { image_data.size = st_sc_image->iSize;//st_sc_image->iWidth * st_sc_image->iHeight * 3 / 2; image_data.format = hiai::YUV420SP; } image_data.data.reset(dataPtr, hiai::Graph::ReleaseDataBuffer); ImageInfo->v_img.push_back(image_data); ImageInfo->b_info.frame_ID.push_back(0); ImageInfo->b_info.batch_size = ImageInfo->b_info.frame_ID.size(); return std::static_pointer_cast<void>(ImageInfo); } HIAI_REGISTER_SERIALIZE_FUNC("ST_SC_IMAGE", ST_SC_IMAGE, GetStScImageSearPtr, GetStScImageDearPtr);
内存管理(C语言)
接口使用要点
- 通过HIAI_DMalloc接口申请内存,关于内存管理,请注意以下要点:
- 申请自动释放内存,用于跨侧数据传输时,如果是智能指针,由于Matrix框架自动释放内存,所以智能指针指定的析构器必须是空的;如果非智能指针,则Matrix框架自动释放。
- 申请手动释放内存,用于跨侧数据传输时,如果是智能指针,则需要指定析构器为HIAI_DFree;如果非智能指针,则数据发送完成后需要调用HIAI_DFree释放内存。
- 申请自动释放内存时,调用SendData接口用于跨侧数据传输后,不允许读写内存中的数据。
- 申请手动释放内存时,如果调用SendData接口用于跨侧数据传输时,在内存释放前,不允许修改内存中的数据,但是可以读取内存中的数据;如果调用SendData接口用于同侧数据传输时,在内存释放前,可以读写内存中的数据。
- 申请自动释放内存,对于该内存中的数据,不允许多次调用SendData接口发送数据。
- 申请内存后,调用SendData接口用于跨侧数据传输时,只能从起始地址处发送数据,不可截取该内存中的某一段数据发送,否则会失败。
- 如果调用HIAI_DVPP_MAlloc接口申请内存,用于Device到Host的数据传输时,由于HIAI_DVPP_MAlloc没有自动释放标签,所以一定需要调用HIAI_DVPP_DFree接口手动释放内存。如果使用智能指针存放申请的内存地址, 必须指定析构器为HIAI_DVPP_DFree。
跨侧数据传输是指Host->Device或Device->Host的数据传输。
同侧数据传输是指Host->Host或Device->Device的数据传输。
HIAI_DMalloc
通过Matrix接口申请Host侧或Device侧的内存块,配合高效数据传输使用。该接口在c_graph.h中定义。
若要给Device端分配DVPP使用的内存,您需要参考HIAI_DVPP_DMalloc。
使用场景:
通过Matrix框架,将大数据从Host端搬运到Device端,该接口需要配合宏:HIAI_REGISTER_SERIALIZE_FUNC使用。
例如:需要将1080P或者4K图像发送到Device端,如果需要提升传输性能,则必须通过HIAI_REGISTER_SERIALIZE_FUNC注册结构体转换和反转函数,另外,大数据块内存则通过HIAI_DMalloc接口申请内存,使用该方式,传输性能将得到很大提升。
该接口主要用于Host与Device的搬运大数据的性能问题,如无性能要求或非传输场景,不建议使用本接口。
函数格式
void* HIAI_DMalloc (const uint32_t dataSize, const uint32_t timeOut, uint32_t flag)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
dataSize |
内存块大小。 |
|
timeOut |
当内存申请失败时,提供时延进行阻塞等待有空余内存,默认值为500毫秒。 |
- |
flag |
|
typedef enum { MEMORY_ATTR_NONE = 0, //框架自行释放DMalloc内存 MEMORY_ATTR_AUTO_FREE = (0x1 << 1), //需要手动调用DFree释放内存 MEMORY_ATTR_MANUAL_FREE = (0x1 << 2), MEMORY_ATTR_MAX } HIAI_MEMORY_ATTR; |
返回值
使用HIAI_DMalloc接口申请到的内存地址。如果申请失败,则返回空指针。
HIAI_DFree
释放通过HiAI接口申请的内存。该接口在c_graph.h中定义。
使用场景:
当用户通过HIAI_DMalloc申请内存后并且没有调用SendData接口发送数据,必须通过该接口释放内存,如果已经调用SendData接口,则不需要调用该接口释放内存。
函数格式
HIAI_StatusT HIAI_DFree (void* dataBuffer)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
dataBuffer |
被释放的内存指针。 |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码示例
序号 |
错误码 |
错误码描述 |
---|---|---|
1 |
HIAI_OK |
running ok |
2 |
HIAI_GRAPH_NOT_EXIST |
graph not exist |
3 |
HIAI_GRAPH_INVALID_VALUE |
graph invalid value |
4 |
HIAI_GRAPH_NOT_FIND_MEMORY |
can't find the memory |
HIAI_DVPP_DMalloc
用于分配内存, 该接口主要用于分配内存给Device端的DVPP使用。该接口在c_graph.h中定义。调用该接口申请内存后,必须使用HIAI_DVPP_DFree接口释放内存。
函数格式
void* HIAI_DVPP_DMalloc(const uint32_t dataSize)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
dataSize |
内存块大小。 |
0~(256M Bytes-96 Bytes),不包含0。推荐使用(256K Bytes-96 Byte)~(256M Bytes-96 Bytes)。 Device侧模型管家会占用96 Bytes。 |
返回值
使用HIAI_DVPP_DMalloc接口申请到的内存地址。如果申请失败,则返回空指针。
使用说明
HIAI_DVPP_DMalloc是专门为了给DVPP分配内存而新增的一个接口,通过该接口申请的内存能够满足DVPP对内存的各种限制及要求。
如果您在旧版本中使用HIAI_DMalloc(1000, buffer, 1000, HIAI_MEMORY_HUGE_PAGE )方式为DVPP申请内存,则需要修改为使用HIAI_DVPP_DMalloc接口申请内存。关于HIAI_DMalloc接口,请参见HIAI_DMalloc。
使用范例:
// 使用HIAI_DVPP_DMalloc申请内存 uint32_t allocSize = 1000; char* allocBuffer = (char*)HIAI_DVPP_DMalloc(allocSize); if (allocBuffer == nullptr) { // 分配失败,进行异常处理 }
HIAI_DVPP_DFree
用于释放内存, 该接口主要用于释放HIAI_DVPP_DMalloc接口分配的内存。该接口在c_graph.h中定义。
函数格式
HIAI_StatusT HIAI_DVPP_DFree(void* dataBuffer)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
dataBuffer |
被释放的内存地址。 |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码示例
序号 |
错误码 |
错误码描述 |
---|---|---|
1 |
HIAI_OK |
running ok |
2 |
HIAI_GRAPH_NOT_EXIST |
graph not exist |
3 |
HIAI_GRAPH_INVALID_VALUE |
graph invalid value |
4 |
HIAI_GRAPH_NOT_FIND_MEMORY |
can't find the memory |
内存管理(C++语言)
接口使用要点
- 通过HIAIMemory::HIAI_DMalloc接口申请内存,关于内存管理,请注意以下要点:
- 申请自动释放内存,用于跨侧数据传输时,如果是智能指针,由于Matrix框架自动释放内存,所以智能指针指定的析构器必须是空的;如果非智能指针,则Matrix框架自动释放。
- 申请手动释放内存,用于跨侧数据传输时,如果是智能指针,则需要指定析构器为HIAIMemory::HIAI_DFree;如果非智能指针,则数据发送完成后需要调用HIAIMemory::HIAI_DFree释放内存。
- 申请自动释放内存时,调用SendData接口用于跨侧数据传输后,不允许读写内存中的数据。
- 申请手动释放内存时,如果调用SendData接口用于跨侧数据传输时,在内存释放前,不允许修改内存中的数据,但是可以读取内存中的数据;如果调用SendData接口用于同侧数据传输时,在内存释放前,可以读写内存中的数据。
- 申请自动释放内存,对于该内存中的数据,不允许多次调用SendData接口发送数据。
- 申请内存后,调用SendData接口用于跨侧数据传输时,只能从起始地址处发送数据,不可截取该内存中的某一段数据发送,否则会失败。
- 如果调用HIAIMemory::HIAI_DVPP_DMalloc接口申请内存,用于Device到Host的数据传输时,由于HIAIMemory::HIAI_DVPP_DMalloc没有自动释放标签,所以一定需要调用HIAIMemory::HIAI_DVPP_DFree接口手动释放内存。如果使用智能指针存放申请的内存地址, 必须指定析构器为HIAIMemory::HIAI_DVPP_DFree。
跨侧数据传输是指Host->Device或Device->Host的数据传输。
同侧数据传输是指Host->Host或Device->Device的数据传输。
HIAIMemory::HIAI_DMalloc
通过Matrix接口申请Host侧或Device侧的内存块,配合高效数据传输使用。该接口在ai_memory.h中定义。
若要给Device端分配DVPP使用的内存,您需要参考HIAIMemory::HIAI_DVPP_DMalloc。
使用场景:
通过Matrix框架,将大数据从Host端搬运到Device端,该接口需要配合宏:HIAI_REGISTER_SERIALIZE_FUNC使用。
例如:需要将1080P或者4K图像发送到Device端,如果需要提升传输性能,则必须通过HIAI_REGISTER_SERIALIZE_FUNC注册结构体转换和反转函数,另外,大数据块内存则通过HIAI_DMalloc接口申请内存,使用该方式,传输性能将得到很大提升。
- 该接口主要用于Host与Device的搬运大数据的性能问题,不推荐当做普通的malloc使用。
- 出于性能考虑,该接口会预申请内存,实际占用内存大小与申请内存大小存在一定差异,该接口的运行时间也会存在波动。
函数格式
static HIAI_StatusT HIAIMemory::HIAI_DMalloc (const uint32_t dataSize, void*& dataBuffer, const uint32_t timeOut = MALLOC_DEFAULT_TIME_OUT, uint32_t flag = MEMORY_ATTR_AUTO_FREE)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
dataSize |
内存块大小。 |
|
dataBuffer |
内存指针。 |
- |
timeOut |
当内存申请失败时,提供时延进行阻塞等待有空余内存,默认值为MALLOC_DEFAULT_TIME_OUT(表示500毫秒)。 |
- |
flag |
|
typedef enum { MEMORY_ATTR_NONE = 0, //框架自行释放DMalloc内存 MEMORY_ATTR_AUTO_FREE = (0x1 << 1), //需要手动调用DFree释放内存 MEMORY_ATTR_MANUAL_FREE = (0x1 << 2), MEMORY_ATTR_MAX } HIAI_MEMORY_ATTR; |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码示例
序号 |
错误码 |
错误码描述 |
---|---|---|
1 |
HIAI_OK |
running ok |
2 |
HIAI_GRAPH_NOT_EXIST |
graph not exist |
3 |
HIAI_GRAPH_MEMORY_POOL_NOT_EXISTED |
memory pool is not existed |
4 |
HIAI_GRAPH_MALLOC_LARGER |
failed to malloc buffer due to the size larger than 256M |
5 |
HIAI_MEMORY_POOL_UPDATE_FAILED |
failed to update memory pool |
6 |
HIAI_GRAPH_SENDMSG_FAILED |
hdc send msg failed |
7 |
HIAI_GRAPH_MEMORY_POOL_INITED |
memory pool has inited |
8 |
HIAI_GRAPH_NO_MEMORY |
no memory |
HIAIMemory::HIAI_DFree
释放通过HiAI接口申请的内存。该接口在ai_memory.h中定义。
使用场景:
当用户通过HIAIMemory::HIAI_DMalloc申请内存后并且没有调用SendData接口发送数据,必须通过该接口释放内存,如果已经调用SendData接口,则不需要调用该接口释放内存。
函数格式
static HIAI_StatusT HIAIMemory::HIAI_DFree (void* dataBuffer)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
dataBuffer |
需要释放的内存指针 |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码示例
序号 |
错误码 |
错误码描述 |
---|---|---|
1 |
HIAI_OK |
running ok |
2 |
HIAI_GRAPH_NOT_EXIST |
graph not exist |
3 |
HIAI_GRAPH_INVALID_VALUE |
graph invalid value |
4 |
HIAI_GRAPH_NOT_FIND_MEMORY |
can't find the memory |
HIAIMemory:: IsDMalloc
用户可调用该接口判断内存是否是由DMalloc申请。该接口在ai_memory.h中定义。
函数格式
static bool IsDMalloc(const void* dataBuffer, const uint32_t& dataSize)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
dataBuffer |
需要判断的内存指针 |
- |
dataSize |
内存地址的大小,单位是字节 |
- |
返回值
true:由DMalloc申请内存。
false:不由DMalloc申请内存
HIAIMemory::HIAI_DVPP_DMalloc
用于分配内存, 该接口主要用于分配内存给Device端的DVPP使用。该接口在ai_memory.h中定义。调用该接口申请内存后,必须使用HIAIMemory::HIAI_DVPP_DFree接口释放内存。
函数格式
HIAI_StatusT HIAI_DVPP_DMalloc(const uint32_t dataSize, void*& dataBuffer)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
dataSize |
内存块大小。 |
0~(256M Bytes-96 Bytes),不包含0。推荐使用(256K Bytes-96 Byte)~(256M Bytes-96 Bytes)。 Device侧模型管家会占用96 Bytes。 |
dataBuffer |
分配出来的内存地址,如果分配失败,为nullptr。 |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码示例
序号 |
错误码 |
错误码描述 |
---|---|---|
1 |
HIAI_OK |
running ok |
2 |
HIAI_GRAPH_NOT_EXIST |
graph not exist |
3 |
HIAI_GRAPH_MEMORY_POOL_NOT_EXISTED |
memory pool is not existed |
4 |
HIAI_GRAPH_MALLOC_LARGER |
failed to malloc buffer due to the size larger than 256M |
5 |
HIAI_MEMORY_POOL_UPDATE_FAILED |
failed to update memory pool |
6 |
HIAI_GRAPH_SENDMSG_FAILED |
hdc send msg failed |
7 |
HIAI_GRAPH_MEMORY_POOL_INITED |
memory pool has inited |
8 |
HIAI_GRAPH_NO_MEMORY |
no memory |
使用说明
HIAIMemory::HIAI_DVPP_DMalloc是专门为了给DVPP分配内存而新增的一个接口,通过该接口申请的内存能够满足DVPP对内存的各种限制及要求。
如果您在旧版本中使用HIAIMemory::HIAI_DMalloc(1000, buffer, 1000, HIAI_MEMORY_HUGE_PAGE )方式为DVPP申请内存,则需要修改为使用HIAIMemory::HIAI_DVPP_DMalloc接口申请内存。关于HIAIMemory::HIAI_DMalloc接口,请参见HIAIMemory::HIAI_DMalloc。
使用范例:
// 使用HIAI_DVPP_DMalloc申请内存 uint32_t allocSize = 1000; char* allocBuffer = nullptr; HIAI_StatusT ret = hiai::HIAIMemory::HIAI_DVPP_DMalloc(allocSize, (void*&)allocBuffer); if (ret != HIAI_OK || allocBuffer == nullptr) { // 分配失败,进行异常处理 }
HIAIMemory::HIAI_DVPP_DFree
用于释放内存, 该接口主要用于释放HIAIMemory::HIAI_DVPP_DMalloc接口分配的内存。该接口在ai_memory.h中定义。
函数格式
HIAI_StatusT HIAI_DVPP_DFree(void* dataBuffer)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
dataBuffer |
被释放的内存地址。 |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码示例
序号 |
错误码 |
错误码描述 |
---|---|---|
1 |
HIAI_OK |
running ok |
2 |
HIAI_GRAPH_NOT_EXIST |
graph not exist |
3 |
HIAI_GRAPH_INVALID_VALUE |
graph invalid value |
4 |
HIAI_GRAPH_NOT_FIND_MEMORY |
can't find the memory |
日志(C++语言)
错误码注册
宏HIAI_DEF_ERROR_CODE
注册错误码。该宏在status.h中定义。
本宏封装用到了以下函数:
static StatusFactory* StatusFactory::StatusFactory::GetInstance(); void RegisterErrorNo(const uint32_t err, const std::string& desc);
函数格式
HIAI_DEF_ERROR_CODE(moduleId, logLevel, codeName, codeDesc)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
moduleId |
模块ID。 |
- |
logLevel |
错误级别。 |
- |
codeName |
错误码的名称。 |
- |
codeDesc |
错误码的描述,字符串。 |
- |
返回值
无。
接口使用示例
/*************************************************************************************** * CopyRight (C) Hisilicon Co., Ltd. * * Filename: user_def_errorcode.h * Description: User defined Error Code * * Version: 1.0 * Created: 2018-01-08 10:15:18 * Author: * * Revision: initial draft; **************************************************************************************/ #ifndef USE_DEF_ERROR_CODE_H_ #define USE_DEF_ERROR_CODE_H_ #include "hiaiengine/status.h" #define USE_DEFINE_ERROR 0x6001 // 自定义日志模块ID,0x6001为自定义值,不能跟status.h文件中的MODID_GRAPH等重复即可 enum { HIAI_INVALID_INPUT_MSG_CODE = 0 // 错误码的名称,0为自定义值 }; HIAI_DEF_ERROR_CODE(USE_DEFINE_ERROR, HIAI_ERROR, HIAI_INVALID_INPUT_MSG, "invalid input message pointer"); #endif
日志打印
通过HIAI_ENGINE_LOG来根据传入的参数调用不同的HIAI_ENGINE_LOG_IMPL函数。在调用格式化函数时,format中参数的类型与个数必须与实际参数类型一致。日志打印相关的接口在log.h中定义。
调用HIAI_ENGINE_LOG后,系统将日志记录日志文件中,日志文件在Host侧或开发者板的“/var”目录下。Device侧的日志被记录在文件名称以device-id开头的日志文件中,Host侧的日志被记录在文件名称以host-0开头的日志文件中。
日志打印格式1
函数格式
#define HIAI_ENGINE_LOG(...) \
HIAI_ENGINE_LOG_IMPL(__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
void HIAI_ENGINE_LOG_IMPL(const char* funcPointer, const char* filePath, int lineNumber,
hiai::Graph* graph, const uint32_t errorCode, const char* format, ...);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
graph |
Graph对象指针 |
- |
errorCode |
错误码 |
- |
format |
log描述 |
- |
... |
format中的可变参数,根据日志内容添加 |
- |
调用示例
auto graph = Graph::Getinstance(1); HIAI_ENGINE_LOG(graph.get(), HIAI_OK, "RUNNING OK");
日志打印格式2
函数格式
#define HIAI_ENGINE_LOG(...) \
HIAI_ENGINE_LOG_IMPL(__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
void HIAI_ENGINE_LOG_IMPL(const char* funcPointer, const char* filePath, int lineNumber,
hiai::Engine* engine, const uint32_t errorCode, const char* format, ...);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
engine |
Engine对象指针 |
- |
errorCode |
错误码 |
- |
format |
log描述 |
- |
... |
format中的可变参数,根据日志内容添加 |
- |
调用示例
// 在HIAI_IMPL_ENGINE_PROCESS里调用此接口 HIAI_ENGINE_LOG(this, HIAI_OK, "RUNNING OK");
日志打印格式3
函数格式
#define HIAI_ENGINE_LOG(...) \
HIAI_ENGINE_LOG_IMPL(__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
void HIAI_ENGINE_LOG_IMPL(const char* funcPointer, const char* filePath, int lineNumber,
const uint32_t errorCode, const char* format, ...);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
errorCode |
错误码 |
- |
format |
log描述 |
- |
... |
format中的可变参数,根据日志内容添加 |
- |
调用示例
HIAI_ENGINE_LOG(HIAI_OK, "RUNNING OK");
日志打印格式4
函数格式
#define HIAI_ENGINE_LOG(...) \
HIAI_ENGINE_LOG_IMPL(__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
void HIAI_ENGINE_LOG_IMPL(const char* funcPointer, const char* filePath, int lineNumber,
const char* format, ...);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
format |
log描述 |
- |
... |
format中的可变参数,根据日志内容添加 |
- |
调用示例
HIAI_ENGINE_LOG("RUNNING OK");
日志打印格式5
函数格式
#define HIAI_ENGINE_LOG(...) \
HIAI_ENGINE_LOG_IMPL(__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
void HIAI_ENGINE_LOG_IMPL(const char* funcPointer, const char* filePath, int lineNumber,
const int32_t moudleID, hiai::Graph* graph, const uint32_t errorCode, const char* format, ...);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
moudleID |
模块名枚举ID |
- |
graph |
Graph对象指针 |
- |
errorCode |
错误码 |
- |
format |
log描述 |
- |
... |
format中的可变参数,根据日志内容添加 |
- |
调用示例
auto graph = Graph::Getinstance(1); HIAI_ENGINE_LOG(MODID_OTHER, graph.get(), HIAI_OK, "RUNNING OK");
日志打印格式6
函数格式
#define HIAI_ENGINE_LOG(...) \
HIAI_ENGINE_LOG_IMPL(__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
void HIAI_ENGINE_LOG_IMPL(const char* funcPointer, const char* filePath, int lineNumber,
const int32_t moudleID,hiai::Engine* engine, const uint32_t errorCode, const char* format, ...);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
moudleID |
模块名枚举ID |
- |
engine |
Engine对象指针 |
- |
errorCode |
错误码 |
- |
format |
log描述 |
- |
... |
format中的可变参数,根据日志内容添加 |
- |
调用示例
// 在HIAI_IMPL_ENGINE_PROCESS里调用此接口 HIAI_ENGINE_LOG(MODID_OTHER, this, HIAI_OK, "RUNNING OK");
日志打印格式7
函数格式
#define HIAI_ENGINE_LOG(...) \
HIAI_ENGINE_LOG_IMPL(__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
void HIAI_ENGINE_LOG_IMPL(const char* funcPointer, const char* filePath, int lineNumber,
const int32_t moudleID, const char* format, ...);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
moudleID |
模块名枚举ID |
- |
format |
log描述 |
- |
... |
format中的可变参数,根据日志内容添加 |
- |
调用示例
HIAI_ENGINE_LOG(MODID_OTHER, "RUNNING OK");
日志打印格式8
函数格式
#define HIAI_ENGINE_LOG(...) \
HIAI_ENGINE_LOG_IMPL(__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
void HIAI_ENGINE_LOG_IMPL(const char* funcPointer, const char* filePath, int lineNumber,
const int32_t moudleID,const uint32_t errorCode, const char* format, ...);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
moudleID |
模块名枚举ID |
- |
errorCode |
错误码 |
- |
format |
log描述 |
- |
... |
format中的可变参数,根据日志内容添加 |
- |
调用示例
HIAI_ENGINE_LOG(MODID_OTHER, HIAI_OK, "RUNNING OK");
队列管理MultiTypeQueue接口(C++语言)
支持多种类型的消息队列保存。队列管理的相关接口在multitype_queue.h中定义。
MultiTypeQueue构造函数
MultiTypeQueue构造函数。
函数格式
MultiTypeQueue(uint32_t queNum, uint32_t maxQueLen = 1024, uint32_t durationMs = 0);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
queNum |
指定队列个数。 |
- |
maxQueLen |
指定每个队列的最大长度。 |
- |
durationMs |
指定队列成员从入队到出队最大时间间隔。当某个成员从入队(Push)起,超过duration_ms时间后还未出队(Pop),则该成员会被自动删除。 |
- |
返回值
无。
PushData
往指定队列插入数据。
函数格式
bool MultiTypeQueue::PushData(uint32_t qIndex, const std::shared_ptr<void>& dataPtr);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
qIndex |
队列编号 |
0 ~ queNum - 1 |
dataPtr |
队列函数指针 |
- |
返回值
成功则返回true,否则返回false(例如队列满等)。
FrontData
读取指定队列头部数据(并不从队列中删除)
函数格式
bool MultiTypeQueue::FrontData(uint32_t qIndex, std::shared_ptr<void>& dataPtr);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
qIndex |
队列编号 |
0 ~ queNum - 1 |
dataPtr |
队列函数指针 |
- |
返回值
成功则返回true,否则返回false(例如队列为空等)。
PopData
读取指定队列头部数据,并从队列中删除。
函数格式
bool MultiTypeQueue::PopData(uint32_t qIndex, std::shared_ptr<void>& dataPtr);
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
qIndex |
队列编号 |
0 ~ que_num-1 |
dataPtr |
队列函数指针 |
- |
返回值
成功则返回true,否则返回false(例如队列为空等)。
PopAllData
PopAllData读取所有队列头部数据。仅当所有队列头部都有数据时才读取成功,并删除队列头部数据。否则,返回失败但并不删除任何数据。
函数格式
template<typename T1>
bool MultiTypeQueue::PopAllData(std::shared_ptr<T1>& arg1);
template<typename T1, typename T2>
bool MultiTypeQueue::PopAllData(std::shared_ptr<T1>& arg1, std::shared_ptr<T2>& arg2);
......
template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16>
bool MultiTypeQueue::PopAllData(std::shared_ptr<T1>& arg1,
std::shared_ptr<T2>& arg2, std::shared_ptr<T3>& arg3,
std::shared_ptr<T4>& arg4, std::shared_ptr<T5>& arg5,
std::shared_ptr<T6>& arg6, std::shared_ptr<T7>& arg7,
std::shared_ptr<T8>& arg8, std::shared_ptr<T9>& arg9,
std::shared_ptr<T16>& arg16)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
arg1 |
队列函数指针 |
- |
... |
队列函数指针 |
- |
arg16 |
队列函数指针 |
- |
返回值
仅当所有队列头部都有数据时才读取成功并返回true,否则返回false。
事件注册接口(C++语言)
Graph::RegisterEventHandle
用户调用RegisterEventHandle接口订阅感兴趣的事件,当前支持Host-Device断开连接事件,用户订阅该事件,当连接断开时,用户可接收到该事件,并在注册的回调函数中处理断开逻辑(如停掉主程序的等待)。该接口在graph.h中定义。
函数格式
HIAI_StatusT Graph::RegisterEventHandle(const HIAIEvent& event, const std::function<HIAI_StatusT(void)>&callBack)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
event |
订阅的事件 |
typedef enum { HIAI_DEVICE_DISCONNECT_EVENT // 断开消息 }HIAIEvent; |
callBack |
事件回调函数 |
用户订阅的回调函数 |
返回值
成功返回HIAI_OK,否则为失败。
其他(C++语言)
DataRecvInterface::RecvData
用户需要定义一个DataRecvInterface类的子类,初始化一个子类的对象,作为数据接收回调函数,传入Graph::SetDataRecvFunctor或Engine::SetDataRecvFunctor。同时,用户需要在子类中重载实现RecvData接口。该接口在data_recv_interface.h中定义。
函数格式
virtual HIAI_StatusT DataRecvInterface::RecvData(const std::shared_ptr<void>& message)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
message |
回调消息 |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码示例
序号 |
错误码 |
错误码描述 |
---|---|---|
1 |
HIAI_OK |
running ok |
Graph::SetPublicKeyForSignatureEncryption
该接口用于设置公钥,该公钥用于对Device侧Matrix要加载的*.so文件进行数字签名验证。需要在创建Graph之前调用该接口。该接口在graph.h中定义。
数字签名采用的算法为SHA256withRSA,本组件只提供数字签名的验证功能,加签的功能需要由用户自己基于该算法进行对需要的SO进行签名,签名文件在host的存放路径需要与SO在统一目录,并且签名文件的名称为SO名称+“.signature”,比如SO的名称为“libhosttodevice.so”,签名文件的名称应为“libhosttodevice.so.signature”。
如果不调用Graph::SetPublicKeyForSignatureEncryption接口或者调用Graph::SetPublicKeyForSignatureEncryption接口的返回值不是HIAI_OK,则Matrix无法设置公钥,Device侧不会启用签名校验机制,因此无法通过数字签名识别出可能被篡改的*.so文件。
函数格式
static HIAI_StatusT Graph::SetPublicKeyForSignatureEncryption(const std::string& publicKey)
参数说明
参数 |
说明 |
取值范围 |
---|---|---|
publicKey |
数字签名验证需要的公钥 |
- |
返回值
返回的部分错误码请参见“错误码示例”中的“错误码”列。
错误码示例
序号 |
错误码 |
错误码描述 |
---|---|---|
1 |
HIAI_OK |
running ok |
std::string publicKey = "-----BEGIN RSA PUBLIC KEY-----\n" "MIIBCAKCAQEAt+kdmu8CdViw2xHlh/JWXOl/0AitDgYGd+9RadULGZmj0tt/UQLv\n" "EYPZaXC8E0a9e97kqfg/ZHinu04XG5RhXv2J0kwkhuBAeCCllefvrQy5OBRqdLYq\n" "EZe8wUO0adSMDsLbPL52b+NdO9/zX+MUzvsBzitWJbiH96s4xCiEERX87/uQfr6F\n" "lHLtrNtooeF2VmxOm3n0yzh4kcSouLgb/O0+v0I+fnR+CTNG95IvzDNOYLWD6ZkL\n" "c7JyIYFZA0CNx9SlPhqbrfjOV5XSG3g3CW0TopUDfHyhAgZt5vACMpeDDx+89tg2\n" "RfT4M9DH/qKzkLlOURvsMShRMD6/PwzsPwIBAw==\n" "-----END RSA PUBLIC KEY-----"; auto ret = Graph::SetPublicKeyForSignatureEncryption(publicKey);