Commit b4a869e5 authored by liucong's avatar liucong
Browse files

修改doc下的cpp文档

parent 3bce2cf5
......@@ -135,8 +135,7 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
// 预处理
// 创建输入数据
migraphx::argument result;
// 当offload为true时,不需要内存拷贝
if(useoffloadcopy)
{
std::unordered_map<std::string, migraphx::argument> inputData;
......@@ -146,32 +145,50 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
std::vector<std::string> outputNames={"resnetv24_dense0_fwd"}; // 设置返回的输出节点
std::vector<migraphx::argument> results = net.eval(inputData,outputNames);
result = results[0]; // 获取第一个输出节点的数据
// 获取输出节点的属性
migraphx::argument result = results[0]; // 获取第一个输出节点的数据
migraphx::shape outputShapes=result.get_shape(); // 输出节点的shape
std::vector<std::size_t> outputSize=outputShapes.lens(); // 每一维大小,维度顺序为(N,C,H,W)
int numberOfOutput=outputShapes.elements(); // 输出节点元素的个数
float *logits=(float *)result.data(); // 输出节点数据指针
...
}
else
else // 当offload为false时,需要内存拷贝
{
// 为输出节点分配device内存,用于保存输出数据
std::unordered_map<std::string, migraphx::argument> modelData=CreateOutputData(net);
// 将输入转换为device数据
migraphx::argument inputData=migraphx::gpu::to_gpu(migraphx::argument{inputShape, (float*)inputBlob.data});
migraphx::argument inputData= migraphx::argument{inputShape, (float*)inputBlob.data};
// 使用device数据作为输入数据,inputData.data()返回的是device地址
modelData[inputName]= migraphx::argument{inputShape, inputData.data()};
// 拷贝到device输入内存
hipMemcpy(inputBuffer_Device, inputData.data(), inputShape.bytes(), hipMemcpyHostToDevice);
// 推理
std::vector<std::string> outputNames={"resnetv24_dense0_fwd"}; // 设置返回的输出节点
std::vector<migraphx::argument> results = net.eval(modelData,outputNames);
std::vector<std::string> outputNames={"resnetv24_dense0_fwd"}; // 设置返回的输出节点
std::vector<migraphx::argument> results = net.eval(programParameters,outputNames);
// 获取输出节点的属性
migraphx::argument result = results[0]; // 获取第一个输出节点的数据
migraphx::shape outputShapes=result.get_shape(); // 输出节点的shape
std::vector<std::size_t> outputSize=outputShapes.lens(); // 每一维大小,维度顺序为(N,C,H,W)
int numberOfOutput=outputShapes.elements(); // 输出节点元素的个数
result = migraphx::gpu::from_gpu(results[0]); // 将第一个输出节点的数据拷贝到host端
// 将device输出数据拷贝到分配好的host输出内存
hipMemcpy(outputBuffer_Host, outputBuffer_Device, outputShapes.bytes(), hipMemcpyDeviceToHost); // 直接使用事先分配好的输出内存拷贝
...
// 释放
hipFree(inputBuffer_Device);
hipFree(outputBuffer_Device);
free(outputBuffer_Host);
}
...
}
```
- 输入数据根据是否需要数据拷贝分为两种:offload=true、offload=false。当offload为true时,执行if分支,不需要进行内存拷贝,inputData表示MIGraphX的输入数据,inputData是一个映射关系,每个输入节点名都会对应一个输入数据,如果有多个输入,则需要为每个输入节点名创建数据,inputName表示输入节点名,migraphx::argument{inputShape, (float*)inputBlob.data}表示该节点名对应的数据,这里是通过前面预处理的数据inputBlob来创建的,第一个参数表示数据的shape,第二个参数表示数据指针。当offload为false时,执行else分支,需要进行内存拷贝,为输入节点和输出节点分配device内存,用来保存输入数据和输出数据,使用device数据作为输入数据,执行推理
- 输入数据根据是否需要数据拷贝分为两种:offload=true、offload=false。当offload为true时,执行if分支,不需要进行内存拷贝,inputData表示MIGraphX的输入数据,inputData是一个映射关系,每个输入节点名都会对应一个输入数据,如果有多个输入,则需要为每个输入节点名创建数据,inputName表示输入节点名,migraphx::argument{inputShape, (float*)inputBlob.data}表示该节点名对应的数据,这里是通过前面预处理的数据inputBlob来创建的,第一个参数表示数据的shape,第二个参数表示数据指针。当offload为false时,执行else分支,需要进行内存拷贝,为输入节点拷贝到device端,经过推理后,再将输出节点数据拷贝到host端
- net.eval(inputData)返回模型的推理结果,由于这里只有一个输出节点,所以std::vector中只有一个数据,results[0]表示第一个输出节点,这里对应resnetv24_dense0_fwd节点,获取输出数据。
另外,如果想要指定输出节点,可以在eval()方法中通过提供outputNames参数来实现:
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment