文档首页> Atlas 500应用> Matrix API参考> 流程编排接口> 接口使用示例> C++接口使用示例(根据配置文件创建Graph,并将生成的Graph回写到list中)
更新时间:2021-03-18 GMT+08:00
分享

C++接口使用示例(根据配置文件创建Graph,并将生成的Graph回写到list中)

/**
* @file graph_cplusplus_api_example.cpp
*
* Copyright(C), 2017 - 2017, Huawei Tech. Co., Ltd. ALL RIGHTS RESERVED.
*
* @Source Files for HIAI Graph Orchestration
*
* @version 1.0
*
*/
#include <unistd.h>
#include <thread>
#include <fstream>
#include <algorithm>
#include "hiaiengine/api.h"
#include "user_def_data_type.h"
/**************************************************************************
* Normally the mandatory steps to setup the whole HIAI graph include:
*  1) call HIAI_Init() API to perform global system initialization;
*  2) create HIAI_CreateGraph or Graph::CreateGraph to create and start graph
*  3) set profile config if necessary
*  4) call HIAI_DestoryGraph or Graph::DestroyGraph to destroy the graph finally
*
***************************************************************************/
// Just define variables which are used in only this example
// and are not required in real user case.
#define MATRIX_USER_SPECIFY_ENGINE_PRIORITY (10)
static uint32_t src_engine_id = 1000;  // 定义在graph.prototxt
static uint32_t dest_engine_id = 1002;  // 定义在graph.prototxt
static std::string graph_config_proto_file = "./config/graph.prototxt";
// Define End
namespace hiai {
class GraphDataRecvInterface: public DataRecvInterface
{
public:
    GraphDataRecvInterface()
    {
    }
    /**
    * @ingroup hiaiengine
    * @brief 读取数据,保存
    * @param [in]输入数据
    * @return HIAI Status
    */
    HIAI_StatusT RecvData(const std::shared_ptr<void>& message)
    {
        // 转换成具体的消息类型,并处理相关消息, 例如:
        // shared_ptr<std::string> data = 
        // std::static_pointer_cast<std::string>(message);
        return HIAI_OK;
    }
private:
};
}
/*************************************************************************
* Matrix Example
* Graph:
* SrcEngine<-->Engine<-->DestEngine
*
*************************************************************************/
HIAI_StatusT HIAI_InitAndStartGraph(std::list<std::shared_ptr<hiai::Graph>>& graphList)
{
    // Step1: Global System Initialization before using Matrix
    HIAI_StatusT status = HIAI_Init(0);
    // Step2: Create and Start the Graph
    status = hiai::Graph::CreateGraph(graph_config_proto_file, graphList);
    if (status != HIAI_OK)
    {
        HIAI_ENGINE_LOG(status, "Fail to start graph");
        return status;
    }
    // Step3: 设置回调函数用于接收数据
    // 如果在一个配置文件中配置了多个graph,可以遍历GraphList取相应graph执行期望操作
    std::list<std::shared_ptr<hiai::Graph>>::iterator iter = graphList.begin();
    std::shared_ptr<hiai::Graph> graph = hiai::Graph::GetInstance((*iter)->GetGraphId());
    if (nullptr == graph)
    {
        HIAI_ENGINE_LOG("Fail to get the graph");
        return status;
    }
    // Specify the port id (default to zero)
    hiai::EnginePortID target_port_config;
    target_port_config.graph_id = (*iter)->GetGraphId();
    target_port_config.engine_id = dest_engine_id;
    target_port_config.port_id = 0;
    graph->SetDataRecvFunctor(target_port_config,
        std::shared_ptr<hiai::GraphDataRecvInterface>(
        new hiai::GraphDataRecvInterface()));
    return HIAI_OK;
}
// User Application Main Example
int main()
{
    HIAI_StatusT ret = HIAI_OK;
    // 存储用户创建的graph
    std::list<std::shared_ptr<hiai::Graph>> graphList;
    // 创建流程
    ret = HIAI_InitAndStartGraph(graphList);
    if(HIAI_OK != ret)
    {
        HIAI_ENGINE_LOG("Fail to start graph");;
        return -1;
    }
    // 读取数据,往流程灌输数据
    std::list<std::shared_ptr<hiai::Graph>>::iterator iter = graphList.begin();
    std::shared_ptr<hiai::Graph> graph = hiai::Graph::GetInstance((*iter)->GetGraphId());
    if (nullptr == graph)
    {
        HIAI_ENGINE_LOG("Fail to get the graph");
        return -1;
    }
    hiai::EnginePortID engine_id;
    engine_id.graph_id = (*iter)->GetGraphId();
    engine_id.engine_id = src_engine_id;
    engine_id.port_id = 0;
    bool is_end_of_data = false;
    while (!is_end_of_data)
    {
        std::shared_ptr<UserDefDataType> user_def_msg(new UserDefDataType);
        // 读取数据并填充 UserDefDataType,此数据类型注册见数据类型注册章节
        // 往Graph灌输数据
        if (HIAI_OK != graph->SendData(engine_id, "UserDefDataType",
            std::static_pointer_cast<void>(user_def_msg)))
        {
            // 队列满时返回发送数据失败,由业务逻辑处理是否重发或丢弃
            HIAI_ENGINE_LOG("Fail to send data to the graph-%u", (*iter)->GetGraphId());
            break;
        }
    }
    // 处理结束时,删除所有Graph
    std::list<std::shared_ptr<hiai::Graph>>::iterator graphIter;
    for (graphIter = graphList.begin(); graphIter != graphList.end(); ++graphIter) {
        hiai::Graph::DestroyGraph((*graphIter)->GetGraphId());
    }
    return 0;
}
分享:

    相关文档

    相关产品