昇腾 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;
}
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 昇腾 AscendCL C++应用开发 创建输入和输出的DataSet和DataBuffer
发表评论 取消回复