From eec3ae0e9045860550294abbd00fa1db6062b2f1 Mon Sep 17 00:00:00 2001 From: Dongju Chae Date: Thu, 21 May 2020 19:42:20 +0900 Subject: [PATCH] [Fix] Make the weight segment instead of reusing model binary This patch makes an additional weight segment instead of reusing model binary. But, in this case, we cannot support model binaries with BUFFER_DMABUF. Also, it removes uncessary weight data memcpy. Signed-off-by: Dongju Chae --- packaging/npu-engine.spec | 2 +- src/core/comm/CommPlugin.h | 2 +- src/core/comm/plugin-comm-ip.cc | 15 ++-- src/core/ne-handler.cc | 163 +++++++++++++++++++++++------------- src/core/ne-handler.h | 5 +- src/core/ne-host-input-service.cc | 8 ++ src/core/ne-model.cc | 11 ++- src/core/ne-model.h | 10 ++- src/core/ne-scheduler.cc | 1 + src/core/ne-segment-table.cc | 51 ++++++----- src/core/ne-segment-table.h | 2 +- src/core/npu/NPUdrvAPI_emul.cc | 19 ++++- tests/apptests/dmabuf_buffers.c | 2 +- tests/apptests/meson.build | 19 +++-- tests/unittests/ne_core_npu_test.cc | 5 +- 15 files changed, 209 insertions(+), 106 deletions(-) diff --git a/packaging/npu-engine.spec b/packaging/npu-engine.spec index c1ff720..bfb97ab 100644 --- a/packaging/npu-engine.spec +++ b/packaging/npu-engine.spec @@ -116,7 +116,7 @@ DESTDIR=%{buildroot} ninja install -C build %{?_smp_mflags} cp -rf /usr/share/npu-engine/testdata/npubinfmt_v1/testcase* sample_models_v1/ cp -rf /usr/share/npu-engine/testdata/npubinfmt_v2/testcase* sample_models_v2/ - cp -rf /usr/share/npu-engine/testdata/npubinfmt_v3/* sample_models_v3/ + cp -rf /usr/share/npu-engine/testdata/npubinfmt_v3/CONV* sample_models_v3/ ./apptests/apptest_example_visa sample_models_v1 > /dev/null ./apptests/apptest_example_visa sample_models_v2 > /dev/null diff --git a/src/core/comm/CommPlugin.h b/src/core/comm/CommPlugin.h index 9dc8866..d1f406e 100644 --- a/src/core/comm/CommPlugin.h +++ b/src/core/comm/CommPlugin.h @@ -27,7 +27,7 @@ class CommPlugin { /** host -> npu-engine */ virtual int extractGenericBuffer (const generic_buffer *buf, void *data, - dataManipFunc func = nullptr) = 0; + dataManipFunc func = nullptr, size_t offset = 0, size_t size = 0) = 0; /** npu-engine -> host */ virtual int insertGenericBuffer (void *data, generic_buffer *buf, dataManipFunc func = nullptr) = 0; diff --git a/src/core/comm/plugin-comm-ip.cc b/src/core/comm/plugin-comm-ip.cc index b143210..36df7d1 100644 --- a/src/core/comm/plugin-comm-ip.cc +++ b/src/core/comm/plugin-comm-ip.cc @@ -44,14 +44,18 @@ public: * @param[in] buf generic buffer * @param[in] data data to be written * @param[in] func data manipulation function + * @param[in] offset the offset of generic buffer to be copied + * @param[in] size the size of generic buffer to be copied * @return 0 if no error. otherwise a negative errno */ int extractGenericBuffer (const generic_buffer *buf, void *data, - dataManipFunc func = nullptr) { + dataManipFunc func = nullptr, size_t offset = 0, size_t size = 0) { if (buf == nullptr || data == nullptr) return -EINVAL; if (buf->size == 0) return -EINVAL; + if (size == 0) + size = buf->size; /** Note that npu-engine supports data manipulation only for the BUFFER_MAPPED. * Thus, for other types, user need to ensure that the data format in the dmabuf @@ -59,11 +63,12 @@ public: if (buf->type == BUFFER_FILE) { std::ifstream ifs (buf->filepath, std::ios::binary); if (ifs.good()) { - ifs.read(static_cast(data), buf->size); + ifs.seekg(offset); + ifs.read(static_cast(data), size); size_t count = ifs.gcount(); ifs.close(); - if (count == buf->size) + if (count == size) return 0; } } else if (buf->type == BUFFER_MAPPED) { @@ -71,9 +76,9 @@ public: return -EINVAL; if (func != nullptr) - func (data, buf->addr, buf->size); + func (data, static_cast(buf->addr) + offset, size); else - memcpy (data, buf->addr, buf->size); + memcpy (data, static_cast(buf->addr) + offset, size); return 0; } diff --git a/src/core/ne-handler.cc b/src/core/ne-handler.cc index 3b71a16..3590635 100644 --- a/src/core/ne-handler.cc +++ b/src/core/ne-handler.cc @@ -1064,18 +1064,9 @@ TrinityVision::setModel (const generic_buffer *model_buf, Model ** model_ptr) Model *model; int status; - switch (model_buf->type) { - case BUFFER_DMABUF: - model = mem_->allocModel (new HWmemExternal); - if (model == nullptr) { - logerr (TAG, "Failed to allocate model\n"); - return -ENOMEM; - } + /** In TRIV1, model data (including program/weight) should be contiguous */ - model->setDmabuf (model_buf->dmabuf); - model->setOffset (model_buf->offset); - model->setSize (model_buf->size); - break; + switch (model_buf->type) { case BUFFER_FILE: case BUFFER_MAPPED: model = mem_->allocModel (new HWmemDevice); @@ -1090,6 +1081,7 @@ TrinityVision::setModel (const generic_buffer *model_buf, Model ** model_ptr) goto delete_exit; } + /** extract the whole model data */ status = comm_.extractGenericBuffer (model_buf, model->getData(), nullptr); if (status != 0) { logerr (TAG, "Failed to extract generic buffer: %d\n", status); @@ -1104,17 +1096,47 @@ TrinityVision::setModel (const generic_buffer *model_buf, Model ** model_ptr) if (status != 0) goto delete_exit; - model_config_t config; - config.dbuf_fd = model->getDmabuf(); - config.program_size = model->getMetadata()->getProgramSize(); - config.program_offset_addr = model->getOffset() + model->getMetadata()->getMetaSize(); - config.weight_offset_addr = config.program_offset_addr + config.program_size; + /** allocate program (optional; NOP) */ + if (model->getMetadata()->getProgramSize() > 0) { + HWmem * hwmem_prog = new HWmem (new HWmemChunk); + model->setProgramData (hwmem_prog); - status = api_->registerModel (&config); - if (status != 0) - goto delete_exit; + hwmem_prog->setParent (model); + hwmem_prog->setOffset (model->getMetadata()->getMetaSize()); + status = hwmem_prog->alloc (model->getMetadata()->getProgramSize()); + if (status != 0) { + logerr (TAG, "Failed to allocate program\n"); + goto delete_exit; + } + + /** register this model to the driver */ + model_config_t config; + config.dbuf_fd = hwmem_prog->getDmabuf (); + config.program_size = hwmem_prog->getSize (); + config.program_offset_addr = hwmem_prog->getOffset (); + + status = api_->registerModel (&config); + if (status != 0) + goto delete_exit; + + model->setInternalID(config.id); + } + + /** allocate weight (optional) */ + if (model->getMetadata()->getWeightSize() > 0) { + HWmem * hwmem_weight = new HWmem (new HWmemChunk); + model->setWeightData (hwmem_weight); + + hwmem_weight->setParent (model); + hwmem_weight->setOffset (model->getMetadata()->getMetaSize() + + model->getMetadata()->getProgramSize()); + status = hwmem_weight->alloc (model->getMetadata()->getWeightSize()); + if (status != 0) { + logerr (TAG, "Failed to allocate program\n"); + goto delete_exit; + } + } - model->setInternalID(config.id); *model_ptr = model; return status; @@ -1123,7 +1145,6 @@ delete_exit: return status; } - /** * @brief implementation of TRIV's run() * @param[in] opmode input opmode @@ -1273,7 +1294,12 @@ delete_segt: return nullptr; } -/** @brief implementation of TRIV2's setModel () */ +/** + * @brief implementation of TRIV2's setModel () + * @param[in] model_buf the model generic buffer + * @param[out] model the model instance + * @return 0 if no error, otherwise a negative errno + */ int TrinityVision2::setModel (const generic_buffer *model_buf, Model ** model_ptr) { @@ -1289,17 +1315,6 @@ TrinityVision2::setModel (const generic_buffer *model_buf, Model ** model_ptr) int status; switch (model_buf->type) { - case BUFFER_DMABUF: - model = mem_->allocModel (new HWmemExternal); - if (model == nullptr) { - logerr (TAG, "Failed to allocate model\n"); - return -ENOMEM; - } - - model->setDmabuf (model_buf->dmabuf); - model->setOffset (model_buf->offset); - model->setSize (model_buf->size); - break; case BUFFER_FILE: case BUFFER_MAPPED: model = mem_->allocModel (new HWmemDevice); @@ -1308,13 +1323,14 @@ TrinityVision2::setModel (const generic_buffer *model_buf, Model ** model_ptr) return -ENOMEM; } - status = model->alloc (model_buf->size); + status = model->alloc (NPUBIN_META_SIZE); if (status != 0) { logerr (TAG, "Failed to allocate model: %d\n", status); goto delete_exit; } - status = comm_.extractGenericBuffer (model_buf, model->getData(), nullptr); + status = comm_.extractGenericBuffer (model_buf, model->getData(), nullptr, + 0, NPUBIN_META_SIZE); if (status != 0) { logerr (TAG, "Failed to extract generic buffer: %d\n", status); goto delete_exit; @@ -1328,19 +1344,62 @@ TrinityVision2::setModel (const generic_buffer *model_buf, Model ** model_ptr) if (status != 0) goto delete_exit; - model_config_t config; - config.dbuf_fd = model->getDmabuf(); - config.program_size = model->getMetadata()->getProgramSize(); - config.program_offset_addr = model->getOffset() + model->getMetadata()->getMetaSize(); - /** [TRIV2] weight is stored in a segment */ - model->setWeightData (model->getData () + model->getMetadata()->getMetaSize() + - model->getMetadata()->getProgramSize()); + /** allocate program (optional; NOP) */ + if (model->getMetadata()->getProgramSize() > 0) { + HWmem * hwmem_prog = new HWmem (new HWmemDevice); + hwmem_prog->setDriverAPI (api_.get()); - status = api_->registerModel (&config); - if (status != 0) - goto delete_exit; + model->setProgramData (hwmem_prog); + + status = hwmem_prog->alloc (model->getMetadata()->getProgramSize()); + if (status != 0) { + logerr (TAG, "Failed to allocate program\n"); + goto delete_exit; + } + + status = comm_.extractGenericBuffer (model_buf, hwmem_prog->getData(), nullptr, + model->getMetadata()->getMetaSize(), + model->getMetadata()->getProgramSize()); + if (status != 0) { + logerr (TAG, "Failed to extract generic buffer: %d\n", status); + goto delete_exit; + } + + /** register this model to the driver */ + model_config_t config; + config.dbuf_fd = hwmem_prog->getDmabuf (); + config.program_size = hwmem_prog->getSize (); + config.program_offset_addr = 0; + + status = api_->registerModel (&config); + if (status != 0) + goto delete_exit; + + model->setInternalID(config.id); + } + + /** allocate weight (optional) */ + if (model->getMetadata()->getWeightSize() > 0) { + HWmem * hwmem_weight = new HWmem (new HWmemDevice); + hwmem_weight->setDriverAPI (api_.get()); + + model->setWeightData (hwmem_weight); + + status = hwmem_weight->alloc (model->getMetadata()->getWeightSize()); + if (status != 0) { + logerr (TAG, "Failed to allocate program\n"); + goto delete_exit; + } + + status = comm_.extractGenericBuffer (model_buf, hwmem_weight->getData(), nullptr, + model->getMetadata()->getMetaSize() + model->getMetadata()->getProgramSize(), + model->getMetadata()->getWeightSize()); + if (status != 0) { + logerr (TAG, "Failed to extract generic buffer: %d\n", status); + goto delete_exit; + } + } - model->setInternalID(config.id); *model_ptr = model; return status; @@ -1370,18 +1429,6 @@ TrinityVision2::run (npu_input_opmode opmode, const Model *model, return -EINVAL; } - if (!model->isExternal ()) { - /** set weight data */ - HWmem * weight = segt->getWeightSegment (); - if (weight == nullptr) { - logerr (TAG, "Failed to get a weight segment\n"); - return -ENOENT; - } - - const Metadata * meta = model->getMetadata (); - memcpy (weight->getData (), model->getWeightData (), meta->getWeightSize ()); - } - if (!segt->isExternal ()) { /** extract input data */ for (uint32_t idx = 0; idx < input->num_buffers; idx++) { diff --git a/src/core/ne-handler.h b/src/core/ne-handler.h index 6670e0e..86cc682 100644 --- a/src/core/ne-handler.h +++ b/src/core/ne-handler.h @@ -143,7 +143,7 @@ class TrinityVision : public Device { Buffer * prepareInputBuffers (const Metadata *meta, const input_buffers *input); - int setModel (const generic_buffer *model_buf, Model ** model_ptr); + int setModel (const generic_buffer *model, Model ** model_ptr); int run (npu_input_opmode opmode, const Model *model, const input_buffers *input, npuOutputNotify cb = nullptr, void *cb_data = nullptr, uint64_t *sequence = nullptr); @@ -163,7 +163,7 @@ class TrinityVision2 : public Device { SegmentTable * prepareSegmentTable (const Model *model, const input_buffers *input); - int setModel (const generic_buffer *model_buf, Model ** model_ptr); + int setModel (const generic_buffer *model, Model ** model_ptr); int run (npu_input_opmode opmode, const Model *model, const input_buffers *input, npuOutputNotify cb = nullptr, void *cb_data = nullptr, uint64_t *sequence = nullptr); @@ -181,7 +181,6 @@ class TrinityAsr : public Device { static size_t manipulateData (const Model *model, uint32_t idx, bool is_input, void *dst, void *src, size_t size); - /** this device type does not require setModel () */ int run (npu_input_opmode opmode, const Model *model, const input_buffers *input, npuOutputNotify cb = nullptr, void *cb_data = nullptr, uint64_t *sequence = nullptr); diff --git a/src/core/ne-host-input-service.cc b/src/core/ne-host-input-service.cc index c6a302a..bc0a4e3 100644 --- a/src/core/ne-host-input-service.cc +++ b/src/core/ne-host-input-service.cc @@ -114,6 +114,10 @@ HostInputService::invoke_buffer (const DriverAPI *api, const Model *model, goto handle_callback; } + /** consider NOP cases */ + if (model->getProgramData() == nullptr) + goto handle_callback; + input_config.model_id = model->getInternalID(); if (buffer != nullptr) { input_config.dbuf_fd = buffer->getDmabuf (); @@ -165,6 +169,10 @@ HostInputService::invoke_segt (const DriverAPI *api, const Model *model, goto handle_callback; } + /** consider NOP cases */ + if (model->getProgramData() == nullptr) + goto handle_callback; + input_config.model_id = model->getInternalID(); if (segt != nullptr) { input_config.dbuf_fd = segt->getDmabuf (); diff --git a/src/core/ne-model.cc b/src/core/ne-model.cc index aa18504..a37e6ba 100644 --- a/src/core/ne-model.cc +++ b/src/core/ne-model.cc @@ -255,7 +255,7 @@ Metadata_v3::getOutputTensorSize (uint32_t idx, data_layout layout) const /** @brief constructor of model class */ Model::Model (const HWmemImpl* impl) - : HWmem (impl), meta_ (nullptr) + : HWmem (impl), weight_data_ (nullptr), program_data_ (nullptr), meta_ (nullptr) { model_id_ = global_model_id_.fetch_add(1); internal_id_ = 0xFFFFFFFFFFFFFFFF; @@ -273,6 +273,15 @@ Model::Model (const HWmemImpl* impl) out_.info[0].type = default_data_type; } +/** @brief destructor of model class */ +Model::~Model () +{ + if (weight_data_ != nullptr) + delete weight_data_; + if (program_data_ != nullptr) + delete program_data_; +} + /** * @brief set data info of input/output tensors * @param[in] in input tensors' data info diff --git a/src/core/ne-model.h b/src/core/ne-model.h index 04534c2..b16ba79 100644 --- a/src/core/ne-model.h +++ b/src/core/ne-model.h @@ -286,18 +286,21 @@ class Metadata_v3 : public Metadata { class Model : public HWmem { public: Model (const HWmemImpl* impl); + ~Model (); void setConstraint (const npuConstraint& constraint) { constraint_ = constraint; } int setDataInfo (const tensors_data_info *in, const tensors_data_info *out); int setMetadata (void *data); - void setWeightData (void *data) { weight_data_ = data; } + void setWeightData (HWmem *data) { weight_data_ = data; } + void setProgramData (HWmem *data) { program_data_ = data; } void setInternalID (uint64_t id) { internal_id_ = id; } const Metadata *getMetadata () const { return meta_.get(); } uint32_t getID () const { return model_id_; } uint64_t getInternalID () const { return internal_id_; } - void * getWeightData () const { return weight_data_; } + HWmem * getWeightData () const { return weight_data_; } + HWmem * getProgramData () const { return program_data_; } uint32_t getInputTensorNum () const; uint32_t getOutputTensorNum () const; @@ -315,7 +318,8 @@ class Model : public HWmem { uint32_t model_id_; /**< model id */ uint64_t internal_id_; /**< model id internally managed by the device */ - void * weight_data_; /**< weight data */ + HWmem * weight_data_; /**< weight data */ + HWmem * program_data_; /**< weight data */ std::unique_ptr meta_; /**< metadata */ npuConstraint constraint_; /**< per-model constraint (e.g., timeout/priority) */ diff --git a/src/core/ne-scheduler.cc b/src/core/ne-scheduler.cc index f447b4b..78590ee 100644 --- a/src/core/ne-scheduler.cc +++ b/src/core/ne-scheduler.cc @@ -63,6 +63,7 @@ Scheduler::submitRequest (Request *req) auto callback = std::bind (&Scheduler::handleCallback, this, req); + /** consider NOP cases */ if (req->getBuffer () != nullptr) status = InferenceEngine::invokeInputService (api_, req->getOpmode(), req->getID(), req->getModel(), req->getBuffer(), callback); diff --git a/src/core/ne-segment-table.cc b/src/core/ne-segment-table.cc index 20329a5..e57108c 100644 --- a/src/core/ne-segment-table.cc +++ b/src/core/ne-segment-table.cc @@ -16,6 +16,7 @@ #define TAG _N73 /** only support npuvinfmt v3 */ #define SUPPORTED_VERSION (3) +#define SEGMENT_ALIGN (0x1000) /** @brief constructor of segment table derived from HWmem */ SegmentTable::SegmentTable (const HWmemImpl* impl) @@ -47,8 +48,9 @@ SegmentTable::~SegmentTable () * @brief set dmabuf fd to each segment slot * @param[in] hwmem hwmem instance * @param[in] slot segment slot + * @return true if no error. otherwise false */ -void +bool SegmentTable::setSegmentSlot (HWmem *hwmem, int slot) { segments_.push_back (std::unique_ptr(hwmem)); @@ -67,6 +69,9 @@ SegmentTable::setSegmentSlot (HWmem *hwmem, int slot) */ reinterpret_cast(getData())[slot] = hwmem->getDmabuf (); reinterpret_cast(getData() + getSize()/2)[slot] = hwmem->getOffset (); + + /** should be aligned */ + return (hwmem->getOffset () % SEGMENT_ALIGN) == 0; } /** @@ -116,27 +121,28 @@ SegmentTable::createSegments (const Model *model, const input_buffers *input) return -EINVAL; } - /** hwmem for weight segment is the back portion of model hwmem */ + /** + * Segments should be 4KB-aligned... So, let's make additional + * weight segment instead of reusing the model binary. + * TODO: How to support model binaries with external dmabuf? + */ if (model->isExternal ()) { - hwmem = new HWmem (new HWmemExternal); - hwmem->setDriverAPI (getDriverAPI ()); - hwmem->setDmabuf (model->getDmabuf ()); - /** offset of weight base addr */ - hwmem->setOffset (model->getOffset () + meta->getMetaSize () + meta->getProgramSize ()); - hwmem->setSize (size); - } else { - hwmem = new HWmem (new HWmemChunk); - hwmem->setParent (const_cast(model)); - hwmem->setOffset (meta->getMetaSize () + meta->getProgramSize ()); + logerr (TAG, "Currently, we don't support a model binary with BUFFER_DMABUF\n"); + segments_.clear (); + return -EINVAL; + } - int status = hwmem->alloc (size); - if (status != 0) { - logerr (TAG, "Failed to allocate %uth segment with size %u: %d\n", - i, size, status); - segments_.clear (); - return status; - } + /** it's a just wrapper of weight data */ + hwmem = new HWmem (new HWmemExternal); + hwmem->setDriverAPI (getDriverAPI ()); + if (model->getWeightData() != nullptr) { + hwmem->setDmabuf (model->getWeightData()->getDmabuf ()); + hwmem->setSize (model->getWeightData()->getSize ()); + } else { + hwmem->setDmabuf (-1); + hwmem->setSize (0); } + hwmem->setOffset (0); } else { /** check input segments */ for (uint32_t j = 0; j < meta->getInputNum (); j++) { /** user provides a external segment */ @@ -161,12 +167,17 @@ SegmentTable::createSegments (const Model *model, const input_buffers *input) logerr (TAG, "Failed to allocate %uth segment with size %u: %d\n", i, size, status); segments_.clear (); + delete hwmem; return status; } } } - setSegmentSlot (hwmem, i); + if (!setSegmentSlot (hwmem, i)) { + logerr (TAG, "Failed to set segment slot: %u\n", i); + segments_.clear (); + return -EINVAL; + } } /** set invalid dmabuf FDs for unused segt slots */ diff --git a/src/core/ne-segment-table.h b/src/core/ne-segment-table.h index 1882d0c..6173733 100644 --- a/src/core/ne-segment-table.h +++ b/src/core/ne-segment-table.h @@ -43,7 +43,7 @@ class SegmentTable : public HWmem { uint32_t getNumOutputSegments () const { return num_output_segments_; } private: - void setSegmentSlot (HWmem *hwmem, int slot); + bool setSegmentSlot (HWmem *hwmem, int slot); std::vector > segments_; /**< segments */ diff --git a/src/core/npu/NPUdrvAPI_emul.cc b/src/core/npu/NPUdrvAPI_emul.cc index 8084b53..d9b62dc 100644 --- a/src/core/npu/NPUdrvAPI_emul.cc +++ b/src/core/npu/NPUdrvAPI_emul.cc @@ -64,6 +64,14 @@ class EmulElement { size_t getSize () const { return size_; } uint64_t getInternalId () const { return internal_id_; } + void setModelConfig (model_config_t *model) { + model_ = *model; + } + + model_config_t & getModelConfig () { + return model_; + } + private: static std::atomic global_id_; /**< element global id (== dmabuf fd) */ @@ -71,6 +79,8 @@ class EmulElement { void *addr_; /**< mapped address */ size_t size_; /**< the allocated size */ uint64_t internal_id_; + + model_config_t model_; }; /** @@ -293,6 +303,7 @@ TrinityEmulAPI::registerModel (model_config_t *model_config) const if (elem == nullptr) return -ENOENT; + elem->setModelConfig (model_config); model_config->id = elem->getInternalId (); return 0; @@ -329,11 +340,14 @@ TrinityEmulAPI::runInput (input_config_t *input_config) const char * addr_model = static_cast(elem_model->getAddr ()); char * addr_input = static_cast(elem_input->getAddr ()); + model_config_t model = elem_model->getModelConfig (); + /** * call NPU C-emulation codes (AIP/NPU_SystemService_Emulator) */ if ((dev_type_ & DEVICETYPE_MASK) == DEVICETYPE_TRIV) { - run_triv_emul (addr_model, addr_input); + run_triv_emul (addr_model + model.program_offset_addr, model.program_size, + addr_input); } else if ((dev_type_ & DEVICETYPE_MASK) == DEVICETYPE_TRIV2) { uint32_t num_segs = input_config->num_segments; char ** segment_table = new char* [num_segs]; @@ -352,7 +366,8 @@ TrinityEmulAPI::runInput (input_config_t *input_config) const segment_table[i] = static_cast(elem->getAddr ()) + offset; } - run_triv2_emul (addr_model, segment_table, num_segs); + run_triv2_emul (addr_model + model.program_offset_addr, model.program_size, + segment_table, num_segs); delete [] segment_table; } diff --git a/tests/apptests/dmabuf_buffers.c b/tests/apptests/dmabuf_buffers.c index 90abdf2..374d965 100644 --- a/tests/apptests/dmabuf_buffers.c +++ b/tests/apptests/dmabuf_buffers.c @@ -76,7 +76,7 @@ run_inference (npudev_h dev) }; /** make model */ - model = make_model (dev, &meta, BUFFER_DMABUF); + model = make_model (dev, &meta, BUFFER_MAPPED); if (!model) goto out; diff --git a/tests/apptests/meson.build b/tests/apptests/meson.build index 04f1a2c..9d66e8a 100644 --- a/tests/apptests/meson.build +++ b/tests/apptests/meson.build @@ -23,15 +23,16 @@ executable ('apptest_async_callbacks', install_dir : join_paths(ne_bindir, 'apptests') ) -executable ('apptest_dmabuf_model', - 'dmabuf_model.c', - include_directories : ne_apptest_inc, - dependencies : ne_test_utils_dep, - link_with : ne_library_shared, - install : true, - install_rpath : ne_libdir, - install_dir : join_paths(ne_bindir, 'apptests') -) +## Do not support dmabuf model +#executable ('apptest_dmabuf_model', +# 'dmabuf_model.c', +# include_directories : ne_apptest_inc, +# dependencies : ne_test_utils_dep, +# link_with : ne_library_shared, +# install : true, +# install_rpath : ne_libdir, +# install_dir : join_paths(ne_bindir, 'apptests') +#) executable ('apptest_dmabuf_buffers', 'dmabuf_buffers.c', diff --git a/tests/unittests/ne_core_npu_test.cc b/tests/unittests/ne_core_npu_test.cc index 66250eb..ff44846 100644 --- a/tests/unittests/ne_core_npu_test.cc +++ b/tests/unittests/ne_core_npu_test.cc @@ -320,6 +320,8 @@ TEST (ne_core_npu_test, run_inference) model_config_t model; model.dbuf_fd = model_dmabuf; /** TODO fix this name in struct */ + model.program_offset_addr = 0; + model.program_size = 0; EXPECT_EQ (api->registerModel (&model), 0); @@ -330,7 +332,8 @@ TEST (ne_core_npu_test, run_inference) /** run with this model */ input_config_t input; input.dbuf_fd = buffer_dmabuf; /** TODO fix this name in struct */ - input.model_id = model_dmabuf; /** TODO fix this name in struct */ + input.model_id = model.id; /** TODO fix this name in struct */ + EXPECT_EQ (api->runInput (&input), 0); EXPECT_EQ (api->dealloc (model_dmabuf), 0); -- 2.7.4