modelbox::BufferList

函数 作用
构造方法 BufferList的构造方法
Build BufferList对象申请指定长度大小的内存空间
BuildFromHost BufferList对象申请指定长度大小的内存空间
Size 获取当前BufferList的长度
GetBytes 获取当前BufferList的字节大小
At 获取BufferList当中特定位置的Buffer
遍历 遍历BufferList
EmplaceBack 把当前设备的数据塞入BufferList当中
EmplaceBackFromHost 把当前设备的数据塞入BufferList当中
ConstBufferData 返回特定位置的Buffer的数据常量指针
MutableBufferData 返回特定位置的Buffer的数据指针
CopyMeta 把参数的BufferList的Meta信息,copy给当前BufferList
Set 设置当前BufferList的某个Meta值
PushBack 将一个Buffer插入到当前的BufferList当中

构造方法

构造BufferList对象

    BufferList();
    BufferList(const std::shared_ptr<Device>& device,
             uint32_t device_mem_flags = 0);

args:

  • device (modelbox::Device) —— 构建BufferList的device对象
  • device_mem_flags (uint32_t) —— device的内存的flag值,只有ascend才会使用,flag=1指的是dvpp的内存
    BufferList(const std::shared_ptr<Buffer>& buffer);
    BufferList(const std::vector<std::shared_ptr<Buffer>>& buffer_vector);

args:

  • buffer (modelbox::Buffer) —— 单Buffer构造BufferList
  • buffer_vector (vector) —— vector的Buffer构建BufferList

Build

BufferList申请Buffer内存空间

    Status Build(const std::vector<size_t>& data_size_list,
                       bool contiguous = true)

args:

  • data_size_list (vector) —— BufferList当中每一个Buffer的size大小
  • contiguous (bool) —— BufferList当中每个Buffer的数据是否连续,默认连续

return:

modelbox.Status 申请结果的状态

example:

    #include <modelbox/buffer.h>

    Status Process(std::shared_ptr<DataContext> data_ctx) {
       auto output_bufs = data_ctx->Output("output");
       auto status = output_bufs->Build({1,1,1});
       MBLOG_INFO << output_bufs->Size();
       for (auto &buffer: output_bufs) {
           MBLOG_INFO << buffer->GetBytes();
       }
    }

result:

3 1
1
1

BuildFromHost

BufferList从主机内存上申请内存空间

    Status BuildFromHost(const std::vector<size_t>& data_size_list,
                               void* data, size_t data_size,
                               DeleteFunction func = nullptr);

args:

  • data_size_list (vector) —— BufferList当中每一个Buffer的size大小
  • data (void*) —— 需要交给BufferList的管理的host的数据指针
  • data_size (size_t) —— 数据的大小
  • func (std::function) —— 析构的函数

return:

modelbox.Status 申请结果的状态

example:

    #include <modelbox/buffer.h>

    Status Process(std::shared_ptr<DataContext> data_ctx) {
       auto output_bufs = data_ctx->Output("output");
       vector<uint8_t> data{122,123,124}
       auto status = output_bufs->BuildFromHost({1,1,1}, data.data(), 3);
       MBLOG_INFO << output_bufs->Size();
       for (auto &buffer: output_bufs) {
           MBLOG_INFO << buffer->GetBytes() << ", " << *((uint8_t*)buffer->MutableData());
       }
    }

result:

3 1, 122 1, 123 1, 124

Size

获取BufferList的Buffer个数

args:

return:

size_t

GetBytes

获取BufferList字节大小

args:

return:

size_t

At

获取指定位置的Buffer

args:

  • pos (size_t) 指定位置

return:

返回指定位置的shared_ptr

遍历

遍历BufferList

example:

    #include <modelbox/buffer.h>

    Status Process(std::shared_ptr<DataContext> data_ctx) {
       auto output_bufs = data_ctx->Output("output");
       vector<uint8_t> data{122,123,124}
       auto status = output_bufs->BuildFromHost({1,1,1}, data.data(), 3);
       MBLOG_INFO << output_bufs->Size();
       for (auto &buffer: output_bufs) {
           MBLOG_INFO << buffer->GetBytes() << ", " << *((uint8_t*)buffer->MutableData());
       }

       auto buffer1 = output_bufs->At(1);
       MBLOG_INFO << *((uint8_t*)buffer->MutableData());
    }

result:

3 1, 122 1, 123 1, 124 123

EmplaceBack

把当前设备的数据转换成Buffer并插入BufferList当中

    Status EmplaceBack(void* device_data, size_t data_size,
                     DeleteFunction func = nullptr);
    Status EmplaceBack(std::shared_ptr<void> device_data, size_t data_size);

args:

  • device_data (void*/std::shared_ptr) —— 需要交给BufferList的管理的device的数据指针
  • data_size (size_t) —— 数据的大小
  • func (std::function) —— 析构的函数

return:

modelbox.Status 插入到BufferList的状态

EmplaceBackFromHost

把主机内存数据转换成Buffer并插入BufferList当中

    Status EmplaceBackFromHost(void* host_data, size_t data_size);

args:

  • host_data (void*) —— 需要交给BufferList的管理的host的数据指针
  • data_size (size_t) —— 数据的大小

return:

modelbox.Status 插入到BufferList的状态

example:

    #include <modelbox/buffer.h>

    Status Process(std::shared_ptr<DataContext> data_ctx) {
        // 该flowunit为1输入1输出,端口号名字分别为input, output
        ...
        auto device_ready_data1 = std::make_shared<uint8_t>(123);
        auto device_ready_data2 = std::make_shared<uint8_t>(124);
        auto host_ready_data1 = std::make_shared<uint8_t>(125);
        auto output_bufs =  data_ctx->Output("output");
        //析构时不做任何操作,释放的时间交给shared_ptr控制, 数据指针在device侧
        output_bufs->EmplaceBack(device_ready_data1.get(), 1, [](void*){})
        //智能指针交给buffer管理, 数据指针在device侧
        output_bufs->EmplaceBack(device_ready_data2, 1);
        //数据指针在host侧
        output_bufs->EmplaceBackFromHost(host_ready_data1.get(), 1);
        return STATUS_OK;
    }

result:

output_bufs插入了3个Buffer

ConstBufferData

获取指定Buffer的数据指针,且只读

    const void* ConstBufferData(size_t idx) const;

args:

  • idx (size_t*) —— 第idx数据

return:

第idx Buffer的数据常量指针

MutableBufferData

获取指定Buffer的数据指针,且可修改

    void* MutableBufferData(size_t idx);

args:

  • idx (size_t*) —— 第idx数据

return:

第idx Buffer的数据指针

example:

    #include <modelbox/buffer.h>

    Status Process(std::shared_ptr<DataContext> data_ctx) {
        auto input_bufs = data->Input("input");
        for (auto i = 0; i < input_bufs->Size(); ++i) {
            // 通过BufferList访问特定位置的数据指针,data1和data2是同一个指针
            void* data2 = input_bufs->ConstBufferData(i);
            ...
        }
    }

CopyMeta

把参数的BufferList的Meta信息拷贝给当前BufferList

     Status CopyMeta(const std::shared_ptr<BufferList>& bufferlist,
                          bool is_override = false);

args:

  • bufferlist (modelbox::BufferList) —— Meta来源的BufferList
  • is_override (bool) —— Meta是否需要覆盖

return:

modelbox::Status 返回CopyMeta接口Status

example:

    Status Process(std::shared_ptr<DataContext> data_ctx) {
        // 获取Buffer中的指定Meta值
        auto input_bufs = data_ctx->Input("input");
        auto output_bufs = data_ctx->Output("output");
        output_bufs->Build({1});

        output_bufs->CopyMeta(input_bufs);

    }

result:

output_bufs具有和原始input_bufs相同的Meta信息

Set

给BufferList当中每一个Buffer都设置Meta值

    template <typename T>
    void Set(const std::string& key, T&& value)

args:

  • key (str) —— Meta的key值

  • value (template) —— Meta的value值

return:

example:

    Status Process(std::shared_ptr<DataContext> data_ctx) {
        // 获取Buffer中的指定Meta值
        auto input_bufs = data_ctx->Input("input");
        auto output_bufs = data_ctx->Output("output");
        output_bufs->Build({1});

        vector<int> shape{28,28};
        output_bufs->Set("shape", shape);

    }

result:

output_bufs当中的每一个Buffer都一个Meta值为shape

PushBack

往BufferList当中插入一个Buffer

    void PushBack(const std::shared_ptr<Buffer>& buf)

args:

  • buf (modelbox::Buffer) —— 需要插入到BufferList当中的Buffer

return:

example:

   Status Process(std::shared_ptr<DataContext> data_ctx) {
        // 获取Buffer中的指定Meta值
        auto input_bufs = data_ctx->Input("input");
        auto output_bufs = data_ctx->Output("output");
        auto buffer = Buffer(GetBindDevice());

        output_bufs->PushBack(buffer);

    }

result:

output_bufs当中push了一个Buffer到数组内

©2022 ModelBox Team all right reserved,powered by Gitbook文件修订时间: 2022-11-18 01:21:29

results matching ""

    No results matching ""