数据传输到Device
基本原理
在Host将图片数据读入内存,再调用aclrtMemcpy接口同步将Host内存中的数据复制到Device内存中,供Device处理。若需实现异步数据复制,需使用aclrtMemcpyAsync接口。
- 若需要在Device进行数据预处理(jpg图片解码、缩放),则与数据预处理相关的内存必须通过acldvppMalloc接口申请。
- 若无需在Device进行数据预处理,则Device内存可以通过aclrtMalloc接口申请。
示例代码
调用接口后,需增加异常处理的分支,同时通过ERROR_LOG记录报错日志、通过INFO_LOG记录各动作的提示日志,示例代码中不一一列举。
示例代码如下,您可以从acl_dvpp_resnet50样例的“src/sample_process.cpp”、“src/dvpp_process.cpp”、“src/utils.cpp”文件中查看完整样例代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <iostream>
#include <fstream>
#include <cstring>
#include "acl/acl.h"
#include "acl/ops/acl_dvpp.h"
//......
//PicDesc是自定义的一个结构体,用于描述图片的路径和名称picName、图片宽width、图片高height。
PicDesc testPic[] = {
{ "../data/dog1_1024_683.jpg", 1024, 683 },
{ "../data/dog2_1024_683.jpg", 1024, 683 },
};
//循环处理每张图片
for (size_t index = 0; index < sizeof(testPic) / sizeof(testPic[0]); ++index) {
//1.自定义函数,调用C++标准库std::ifstream中的函数读取图片文件,并输出图片文件占用的内存大小inputHostBuffSize,返回值为图片文件在Host上的内存地址inputHostBuff。
char* inputHostBuff = ReadBinFile(testPic.picName, inputHostBuffSize);
//2.申请图片解码的输入内存
void *inBufferDev = nullptr;
uint32_t inBufferSize = inputHostBuffSize;
aclError ret = acldvppMalloc(&inBufferDev, inBufferSize);
//3.通过内存拷贝的方式,将Host数据传输到Device。
ret = aclrtMemcpy(inBufferDev, inBufferSize, inputHostBuff, inputHostBuffSize, ACL_MEMCPY_HOST_TO_DEVICE);
//TODO:数据预处理(图片解码+缩放)
}
//......
|
