更新时间:2021-03-18 GMT+08:00
分享

数据传输到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:数据预处理(图片解码+缩放)
}
//......
分享:

    相关文档

    相关产品

close