昇腾 AscendCL C++应用开发 创建输入和输出的DataSet和DataBuffer

flyfish

根据 昇腾 AscendCL C++应用开发 获取模型的信息 这篇文章,将模型信息获取到之后,就可以创建输入和输出的DataSet和DataBuffer

创建 DataBuffer

aclCreateDataBuffer(void *data, size_t size) 这个函数是用来创建一个数据缓冲区(DataBuffer)的。

data 参数:这是一个指针,指向你要传递的数据所在的内存地址。这块内存可以是在主机(Host)上的,也可以是在设备(Device)上的,具体取决于应用场景。
size 参数:表示你想要传递的数据的大小,以字节为单位。

创建 DataSet

aclmdlCreateDataset() 这个函数用来创建一个数据集(DataSet)。不同于 DataBuffer,一个 DataSet 可能包含多个 DataBuffer,因此它被设计为创建一个空的容器。
返回值:返回一个指向新创建的 DataSet 的指针。

向 DataSet 中添加 DataBuffer

aclmdlAddDatasetBuffer(aclmdlDataset *dataset, aclDataBuffer *dataBuffer) 这个函数是用来把一个 DataBuffer 放到 DataSet 里的。
dataset 参数:是指向你之前创建的那个 DataSet 的指针。
dataBuffer 参数:是指向你要添加到 DataSet 里的 DataBuffer 的指针。
在这里插入图片描述

部分封装代码

Result AclResource::InitResource()
{
    // ACL init
    const char *aclConfigPath = nullptr;
    aclError ret = aclInit(aclConfigPath);
    if (ret) {
        std::cout<<"acl get run mode failed"<<std::endl;
        return FAILED;
    }
    
    // open device
    ret = aclrtSetDevice(deviceId_);
    if (ret) {
        std::cout<<"Acl open device failed"<<std::endl;
        return FAILED;
    }

    // create context
    ret = aclrtCreateContext(&context_, deviceId_);
    if (ret) {
        std::cout<<"acl create context failed"<<std::endl;
        return FAILED;
    }

    // create stream
    ret = aclrtCreateStream(&stream_);
    if (ret) {
        std::cout<<"acl create stream failed"<<std::endl;
        return FAILED;
    }

    // Gets whether the current application is running on host or Device
    ret = aclrtGetRunMode(&g_runMode_);
    if (ret) {
        std::cout<<"acl get run mode failed"<<std::endl;
        return FAILED;
    }

    ret = aclmdlLoadFromFile(modelPath_, &modelId_);
    if(ret){
        std::cout<<"loadding model error, model name: " << modelPath_ << std::endl;
        return FAILED;
    }

    modelDesc_ = aclmdlCreateDesc();
    if (modelDesc_ == nullptr) {
        std::cout<<"create model description failed"<<std::endl;
        return FAILED;
    }

    ret = aclmdlGetDesc(modelDesc_, modelId_);
    if (ret) {
        std::cout<<"get model description failed"<<std::endl;
        return FAILED;
    }

    return SUCCESS;
}

//创造输入数据
Result AclResource::CreateInput() {

    //1
    aclError aclRet = aclrtMalloc(&imageDataBuf_, imageDataSize_, ACL_MEM_MALLOC_HUGE_FIRST);

    if (aclRet != ACL_SUCCESS) {
  

         std::cout<<"malloc device buffer failed  size is"<<imageDataSize_<<"errorCode is"<<static_cast<int32_t>(aclRet)<<std::endl;

        return FAILED;
    }


    input_ = aclmdlCreateDataset();
    if (input_ == nullptr) {
        std::cout<<"can't create dataset, create input failed"<<std::endl;
        return FAILED;
    }
        
    aclDataBuffer* inputData = aclCreateDataBuffer(imageDataBuf_, imageDataSize_);
    if (inputData == nullptr) {
        std::cout<<"can't create data buffer, create input failed"<<std::endl;
        return FAILED;
    }

    aclError ret = aclmdlAddDatasetBuffer(input_, inputData);
    if (inputData == nullptr) {
        std::cout<<"can't add data buffer, create input failed"<<std::endl;
        aclDestroyDataBuffer(inputData);
        inputData = nullptr;
        return FAILED;
    }

    return SUCCESS;
}

//创造输出数据
Result AclResource::CreateOutput() {

    if (modelDesc_ == nullptr) {
        std::cout<<"no model description, create ouput failed"<<std::endl;
        return FAILED;
    }


    output_ = aclmdlCreateDataset();
    if (output_ == nullptr) {
        std::cout<<"can't create dataset, create output failed"<<std::endl;
        return FAILED;
    }

    size_t outputSize = aclmdlGetNumOutputs(modelDesc_);
    for (size_t i = 0; i < outputSize; ++i) {
        size_t buffer_size = aclmdlGetOutputSizeByIndex(modelDesc_, i);

        void *outputBuffer = nullptr;
        aclError ret = aclrtMalloc(&outputBuffer, buffer_size, ACL_MEM_MALLOC_NORMAL_ONLY);
        if (ret) {
            std::cout<<"can't malloc buffer, create output failed"<<std::endl;
            return FAILED;
        }

        aclDataBuffer* outputData = aclCreateDataBuffer(outputBuffer, buffer_size);
        if (ret) {
            std::cout<<"can't create data buffer, create output failed"<<std::endl;
            aclrtFree(outputBuffer);
            return FAILED;
        }

        ret = aclmdlAddDatasetBuffer(output_, outputData);
        if (ret) {
            std::cout<<"can't add data buffer, create output failed"<<std::endl;
            aclrtFree(outputBuffer);
            aclDestroyDataBuffer(outputData);
            return FAILED;
        }
    }

    return SUCCESS;

}

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部