From 45a5b641a8456b9d3623435946a92c6c2503d228 Mon Sep 17 00:00:00 2001 From: xiangbingj <1137486478@qq.com> Date: Mon, 25 Nov 2019 17:57:00 +0800 Subject: [PATCH] Flush kmodel data from CACHE to IOMEM. --- .vscode/settings.json | 3 +-- lib/bsp/device/kpu.cpp | 35 +++++++++++++++++------------------ lib/hal/include/kpu.h | 2 ++ 3 files changed, 20 insertions(+), 20 deletions(-) mode change 100644 => 100755 lib/hal/include/kpu.h diff --git a/.vscode/settings.json b/.vscode/settings.json index 99dbdd8..7c51e43 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,5 @@ { "files.associations": { - "fft_soft.h": "c", - "devices.h": "c" + "span": "cpp" } } \ No newline at end of file diff --git a/lib/bsp/device/kpu.cpp b/lib/bsp/device/kpu.cpp index a7cfc32..98c44f8 100755 --- a/lib/bsp/device/kpu.cpp +++ b/lib/bsp/device/kpu.cpp @@ -48,7 +48,7 @@ public: k_model_context(uint8_t *buffer) { #if FIX_CACHE - configASSERT(!is_memory_cache((uintptr_t)buffer)); + configASSERT(is_memory_cache((uintptr_t)buffer)); #endif uintptr_t base_addr = (uintptr_t)buffer; @@ -61,6 +61,17 @@ public: layer_headers_ = (const kpu_model_layer_header_t *)((uintptr_t)outputs_ + sizeof(kpu_model_output_t) * output_count_); layers_length_ = header->layers_length; body_start_ = (const uint8_t *)((uintptr_t)layer_headers_ + sizeof(kpu_model_layer_header_t) * header->layers_length); + + uint32_t body_size = 0; + for(int i=0; ibody_size; + } + uint8_t *body_start_iomem = (uint8_t *)((uintptr_t)body_start_ - IOMEM); + const uint8_t *body_start_cache = body_start_; + memcpy(body_start_iomem, body_start_cache, body_size); + storage_ = std::make_unique(header->main_mem_usage); main_buffer_ = { storage_.get(), ptrdiff_t(header->main_mem_usage) }; } @@ -342,7 +353,6 @@ private: void kpu_input_dma(const kpu_layer_argument_t *layer, const uint8_t *src) { - configASSERT(!is_memory_cache((uintptr_t)src)); uint64_t input_size = layer->kernel_calc_type_cfg.data.channel_switch_addr * 64 * (layer->image_channel_num.data.i_ch_num + 1); dma_set_request_source(dma_ch_, dma_req_); @@ -622,12 +632,7 @@ private: { size_t count = arg->count; const float *src = (const float *)(ctx_.main_buffer + arg->main_mem_in_address); - kpu_model_quant_param_t q; -#if FIX_CACHE - memcpy(&q, &arg->quant_param, sizeof(kpu_model_quant_param_t)); -#else - q = arg->quant_param; -#endif + kpu_model_quant_param_t q = arg->quant_param; float scale = 1.f / q.scale; @@ -647,12 +652,7 @@ private: const uint8_t *src = (const uint8_t *)(ctx_.main_buffer + arg->main_mem_in_address); float *dest = (float *)(ctx_.main_buffer + arg->main_mem_out_address); size_t oc, count = arg->count; - kpu_model_quant_param_t q; -#if FIX_CACHE - memcpy(&q, &arg->quant_param, sizeof(kpu_model_quant_param_t)); -#else - q = arg->quant_param; -#endif + kpu_model_quant_param_t q = arg->quant_param; for (oc = 0; oc < count; oc++) dest[oc] = *src++ * q.scale + q.bias; @@ -797,11 +797,10 @@ private: void kpu_conv(const kpu_model_conv_layer_argument_t *arg) { - configASSERT(!is_memory_cache((uintptr_t)ctx_.model_buffer)); volatile kpu_layer_argument_t layer = *(kpu_layer_argument_t *)(ctx_.model_buffer + arg->layer_offset); - layer.kernel_load_cfg.data.para_start_addr = (uintptr_t)(ctx_.model_buffer + arg->weights_offset); - layer.kernel_pool_type_cfg.data.bwsx_base_addr = (uintptr_t)(ctx_.model_buffer + arg->bn_offset); - layer.kernel_calc_type_cfg.data.active_addr = (uintptr_t)(ctx_.model_buffer + arg->act_offset); + layer.kernel_load_cfg.data.para_start_addr = (uintptr_t)(ctx_.model_buffer + arg->weights_offset) - IOMEM; + layer.kernel_pool_type_cfg.data.bwsx_base_addr = (uintptr_t)(ctx_.model_buffer + arg->bn_offset) - IOMEM; + layer.kernel_calc_type_cfg.data.active_addr = (uintptr_t)(ctx_.model_buffer + arg->act_offset) - IOMEM; if (arg->flags & KLF_MAIN_MEM_OUT) { diff --git a/lib/hal/include/kpu.h b/lib/hal/include/kpu.h old mode 100644 new mode 100755 index b3a7199..94de6ba --- a/lib/hal/include/kpu.h +++ b/lib/hal/include/kpu.h @@ -22,6 +22,8 @@ extern "C" { #endif +#define IOMEM 0x40000000 + typedef struct { union