forked from mindspore-Ecosystem/mindspore
[MSLITE][DEVELOP] code review for lite: base op directory, include directory
This commit is contained in:
parent
82e8436841
commit
3afea5ce9d
|
@ -139,7 +139,6 @@ class MS_API Kernel {
|
|||
/// \param[in] value define the kernel's attribute value.
|
||||
void SetAttr(const std::string &key, const std::string &value) { attrs_[key] = value; }
|
||||
|
||||
protected:
|
||||
std::string name_;
|
||||
const mindspore::Context *context_ = nullptr;
|
||||
std::vector<mindspore::MSTensor> inputs_;
|
||||
|
|
|
@ -21,7 +21,7 @@ void DepthToSpaceForNHWC(const void *input, void *output, const int *in_shape, c
|
|||
int32_t block_size = param->block_size_;
|
||||
int32_t in_shape_dim2 = in_shape[2];
|
||||
int32_t in_shape_dim1 = in_shape[1];
|
||||
size_t copy_size = block_size * param->out_stride_dim2_ * param->data_type_size_;
|
||||
size_t copy_size = (size_t)block_size * param->out_stride_dim2_ * param->data_type_size_;
|
||||
for (int i = 0; i < in_shape[0]; ++i) {
|
||||
int in_offset_n = i * param->in_stride_dim0_;
|
||||
int out_offset_n = i * param->out_stride_dim0_;
|
||||
|
|
|
@ -23,7 +23,7 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
static inline void ApproximateZerosLike(void *output, int data_size) {
|
||||
memset(output, 0.0, data_size);
|
||||
(void)memset(output, 0, data_size);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ typedef struct NpuDeviceInfo {
|
|||
|
||||
/// \brief AscendDeviceInfo defined for Ascend's configuration information.
|
||||
typedef struct AscendDeviceInfo {
|
||||
uint32_t device_id_;
|
||||
uint32_t device_id_ = 0;
|
||||
std::string batch_size_;
|
||||
std::string image_size_;
|
||||
} AscendDeviceInfo;
|
||||
|
|
|
@ -116,7 +116,7 @@ class MS_API KernelReg {
|
|||
/// \param[in] creator Define a function pointer to create a kernel.
|
||||
KernelReg(const std::string &arch, const std::string &provider, DataType data_type, int op_type,
|
||||
const CreateKernel creator) {
|
||||
RegisterKernel::RegKernel(arch, provider, data_type, op_type, creator);
|
||||
(void)RegisterKernel::RegKernel(arch, provider, data_type, op_type, creator);
|
||||
}
|
||||
|
||||
/// \brief Method to register customized op.
|
||||
|
@ -128,7 +128,7 @@ class MS_API KernelReg {
|
|||
/// \param[in] creator Define a function pointer to create a kernel.
|
||||
KernelReg(const std::string &arch, const std::string &provider, DataType data_type, const std::string &op_type,
|
||||
const CreateKernel creator) {
|
||||
RegisterKernel::RegCustomKernel(arch, provider, data_type, op_type, creator);
|
||||
(void)RegisterKernel::RegCustomKernel(arch, provider, data_type, op_type, creator);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@ class MS_API KernelInterfaceReg {
|
|||
/// \param[in] op_type Define the ordinary op type.
|
||||
/// \param[in] creator Define the KernelInterface create function.
|
||||
KernelInterfaceReg(const std::string &provider, int op_type, const KernelInterfaceCreator creator) {
|
||||
RegisterKernelInterface::Reg(provider, op_type, creator);
|
||||
(void)RegisterKernelInterface::Reg(provider, op_type, creator);
|
||||
}
|
||||
|
||||
/// \brief Constructor of KernelInterfaceReg to register custom op.
|
||||
|
@ -92,7 +92,7 @@ class MS_API KernelInterfaceReg {
|
|||
/// \param[in] op_type Define the concrete type of a custom op.
|
||||
/// \param[in] creator Define the KernelInterface create function.
|
||||
KernelInterfaceReg(const std::string &provider, const std::string &op_type, const KernelInterfaceCreator creator) {
|
||||
RegisterKernelInterface::CustomReg(provider, op_type, creator);
|
||||
(void)RegisterKernelInterface::CustomReg(provider, op_type, creator);
|
||||
}
|
||||
|
||||
virtual ~KernelInterfaceReg() = default;
|
||||
|
|
|
@ -17,17 +17,6 @@
|
|||
#ifndef MINDSPORE_LITE_SRC_CXX_API_CALLBACK_CALLBACK_IMPL_H_
|
||||
#define MINDSPORE_LITE_SRC_CXX_API_CALLBACK_CALLBACK_IMPL_H_
|
||||
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
#include <unordered_map>
|
||||
#include "include/api/model.h"
|
||||
#include "include/api/context.h"
|
||||
#include "include/api/cell.h"
|
||||
#include "include/lite_session.h"
|
||||
#include "include/train/train_loop_callback.h"
|
||||
|
||||
namespace mindspore {
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <memory>
|
||||
#include "include/api/types.h"
|
||||
#include "include/api/data_type.h"
|
||||
#include "include/lite_types.h"
|
||||
#include "src/runtime/inner_allocator.h"
|
||||
#include "src/common/log_adapter.h"
|
||||
#include "src/delegate/tensorrt/distribution/distribution_base.h"
|
||||
|
@ -109,6 +110,10 @@ void Context::SetThreadAffinity(int mode) {
|
|||
MS_LOG(ERROR) << "Invalid context.";
|
||||
return;
|
||||
}
|
||||
if (mode < lite::NO_BIND || mode > lite::MID_CPU) {
|
||||
MS_LOG(WARNING) << "Invalid thread affinity mode: " << mode << ", change to NO_BIND mode.";
|
||||
mode = lite::NO_BIND;
|
||||
}
|
||||
data_->affinity_mode_ = mode;
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ Status ContextUtils::AddCpuDevice(const std::shared_ptr<Allocator> &allocator, i
|
|||
MS_LOG(ERROR) << "Invalid affinity mode, only supports 0:no affinities, 1:big cores first, 2:little cores first.";
|
||||
return kLiteInputParamInvalid;
|
||||
}
|
||||
lite::DeviceInfo device_info = {0};
|
||||
lite::DeviceInfo device_info;
|
||||
device_info.cpu_device_info_ = {enable_fp16, static_cast<lite::CpuBindMode>(affinity_mode)};
|
||||
inner_context->device_list_.push_back({lite::DT_CPU, device_info, provider, provider_device, allocator});
|
||||
return kSuccess;
|
||||
|
@ -46,7 +46,7 @@ Status ContextUtils::AddGpuDevice(bool enable_fp16, uint32_t device_id, int rank
|
|||
bool enable_gl_texture, void *gl_context, void *gl_display,
|
||||
const std::string &provider, const std::string &provider_device,
|
||||
const std::shared_ptr<Allocator> &allocator, lite::InnerContext *inner_context) {
|
||||
lite::DeviceInfo device_info = {0};
|
||||
lite::DeviceInfo device_info;
|
||||
device_info.gpu_device_info_ = {enable_fp16, device_id, rank_id, group_size,
|
||||
enable_gl_texture, gl_context, gl_display};
|
||||
inner_context->device_list_.push_back({lite::DT_GPU, device_info, provider, provider_device, allocator});
|
||||
|
@ -54,14 +54,14 @@ Status ContextUtils::AddGpuDevice(bool enable_fp16, uint32_t device_id, int rank
|
|||
}
|
||||
|
||||
Status ContextUtils::AddNpuDevice(int frequency, lite::InnerContext *inner_context) {
|
||||
lite::DeviceInfo device_info = {0};
|
||||
lite::DeviceInfo device_info;
|
||||
device_info.npu_device_info_ = {frequency};
|
||||
inner_context->device_list_.push_back({lite::DT_NPU, device_info});
|
||||
return kSuccess;
|
||||
}
|
||||
|
||||
Status ContextUtils::AddAscendDevice(lite::InnerContext *inner_context, DeviceInfoContext *device) {
|
||||
lite::DeviceInfo device_info = {0};
|
||||
lite::DeviceInfo device_info;
|
||||
auto ascend_context = device->Cast<AscendDeviceInfo>();
|
||||
device_info.ascend_device_info_ = {ascend_context->GetDeviceID(), ascend_context->GetDynamicBatchSize(),
|
||||
ascend_context->GetDynamicImageSize()};
|
||||
|
|
|
@ -36,7 +36,7 @@ class Graph::GraphData {
|
|||
|
||||
std::shared_ptr<lite::Model> lite_model() { return lite_model_; }
|
||||
|
||||
bool IsTrainModel() { return true; }
|
||||
bool IsTrainModel() const { return true; }
|
||||
|
||||
private:
|
||||
std::shared_ptr<lite::Model> lite_model_ = nullptr;
|
||||
|
|
|
@ -17,18 +17,7 @@
|
|||
#ifndef MINDSPORE_LITE_SRC_CXX_API_METRICS_METRICS_ADAPTER_H_
|
||||
#define MINDSPORE_LITE_SRC_CXX_API_METRICS_METRICS_ADAPTER_H_
|
||||
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
#include <unordered_map>
|
||||
#include "include/api/model.h"
|
||||
#include "include/api/context.h"
|
||||
#include "include/api/cell.h"
|
||||
#include "include/api/metrics/metrics.h"
|
||||
#include "include/lite_session.h"
|
||||
#include "include/train/metrics.h"
|
||||
|
||||
namespace mindspore {
|
||||
|
|
|
@ -34,7 +34,7 @@ Key::Key(const char *dec_key, size_t key_len) {
|
|||
return;
|
||||
}
|
||||
|
||||
memcpy(key, dec_key, key_len);
|
||||
(void)memcpy(key, dec_key, key_len);
|
||||
len = key_len;
|
||||
}
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ class MSTensor::Impl {
|
|||
#endif
|
||||
|
||||
virtual const std::string &Name() const {
|
||||
static std::string empty = "";
|
||||
static const std::string empty = "";
|
||||
if (lite_tensor_ == nullptr) {
|
||||
MS_LOG(ERROR) << "Invalid tensor.";
|
||||
return empty;
|
||||
|
@ -111,7 +111,7 @@ class MSTensor::Impl {
|
|||
}
|
||||
|
||||
virtual const std::vector<int64_t> &Shape() const {
|
||||
static std::vector<int64_t> empty;
|
||||
static std::vector<int64_t> empty{};
|
||||
if (lite_tensor_ == nullptr) {
|
||||
MS_LOG(ERROR) << "Invalid tensor.";
|
||||
return empty;
|
||||
|
|
|
@ -15,8 +15,8 @@
|
|||
*/
|
||||
|
||||
#include "include/api/types.h"
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include <cstring>
|
||||
#include <limits>
|
||||
#include <numeric>
|
||||
#include "include/api/status.h"
|
||||
#include "include/api/dual_abi_helper.h"
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
#define MINDSPORE_LITE_SRC_RUNTIME_KERNEL_ARM_BASE_CALL_H_
|
||||
|
||||
#include <vector>
|
||||
#include "src/runtime/kernel/arm/base/carry_data.h"
|
||||
#include "src/tensor.h"
|
||||
#include "src/inner_kernel.h"
|
||||
#ifndef CONTROLFLOW_TENSORLIST_CLIP
|
||||
#include "src/tensorlist.h"
|
||||
#endif
|
||||
|
|
|
@ -1,139 +0,0 @@
|
|||
/**
|
||||
* Copyright 2020 Huawei Technologies Co., Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "src/runtime/kernel/arm/base/carry_data.h"
|
||||
#include "include/errorcode.h"
|
||||
|
||||
using mindspore::lite::RET_ERROR;
|
||||
using mindspore::lite::RET_NOT_SUPPORT;
|
||||
using mindspore::lite::RET_OK;
|
||||
|
||||
namespace mindspore::kernel {
|
||||
int CarryDataKernel::MoveData(const std::vector<lite::Tensor *>::iterator &dst_begin,
|
||||
const std::vector<lite::Tensor *>::iterator &dst_end,
|
||||
const std::vector<lite::Tensor *>::iterator &src_begin,
|
||||
const std::vector<lite::Tensor *>::iterator &src_limit) {
|
||||
for (auto dst_iter = dst_begin, src_iter = src_begin; dst_iter != dst_end; dst_iter++, src_iter++) {
|
||||
if (src_iter == src_limit) {
|
||||
MS_LOG(ERROR) << "out of range of input tensor";
|
||||
return RET_ERROR;
|
||||
}
|
||||
auto *dst_tensor = *dst_iter;
|
||||
auto *src_tensor = *src_iter;
|
||||
if (dst_tensor == nullptr || src_tensor == nullptr) {
|
||||
MS_LOG(ERROR) << "input tensor or output tensor of merge is nullptr";
|
||||
return RET_ERROR;
|
||||
}
|
||||
lite::STATUS ret = RET_OK;
|
||||
if (src_tensor->IsConst() || src_tensor->IsGraphInput()) {
|
||||
MS_LOG(DEBUG) << "Carry const data and graph inputs.";
|
||||
dst_tensor->set_data(src_tensor->data());
|
||||
dst_tensor->set_own_data(false);
|
||||
} else {
|
||||
if (src_tensor->data_type() == kObjectTypeTensorType && dst_tensor->data_type() == kObjectTypeTensorType) {
|
||||
#ifndef CONTROLFLOW_TENSORLIST_CLIP
|
||||
MS_LOG(DEBUG) << "Carry MoveTensorListData";
|
||||
ret = MoveTensorListData(reinterpret_cast<lite::TensorList *>(dst_tensor),
|
||||
reinterpret_cast<lite::TensorList *>(src_tensor));
|
||||
#else
|
||||
MS_LOG(ERROR) << unsupport_controlflow_tensorlist_log;
|
||||
return RET_NOT_SUPPORT;
|
||||
#endif
|
||||
} else {
|
||||
MS_LOG(DEBUG) << "Carry MoveTensorData";
|
||||
ret = MoveTensorData(dst_tensor, src_tensor);
|
||||
}
|
||||
}
|
||||
if (ret != RET_OK) {
|
||||
MS_LOG(ERROR) << "Move data failed : " << ret;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
int CarryDataKernel::MoveTensorData(lite::Tensor *dst_tensor, lite::Tensor *src_tensor) {
|
||||
if (dst_tensor->data_type() != src_tensor->data_type() || dst_tensor->format() != src_tensor->format() ||
|
||||
!(dst_tensor->shape() == src_tensor->shape() || (dst_tensor->shape().empty() && src_tensor->shape().empty()))) {
|
||||
MS_LOG(ERROR) << "input tensor and output tensor is incompatible.";
|
||||
MS_LOG(ERROR) << "input tensor data_type: " << src_tensor->data_type() << " vs "
|
||||
<< "output tensor data_type: " << dst_tensor->data_type()
|
||||
<< "input tensor format: " << src_tensor->format() << " vs "
|
||||
<< "output tensor format: " << dst_tensor->format() << " input tensor shape: " << src_tensor->shape()
|
||||
<< " vs "
|
||||
<< "output tensor shape: " << dst_tensor->shape();
|
||||
return RET_ERROR;
|
||||
}
|
||||
if (src_tensor->allocator() == nullptr) {
|
||||
MS_LOG(ERROR) << "src_tensor allocator is nullptr.";
|
||||
return RET_ERROR;
|
||||
}
|
||||
|
||||
CHECK_NULL_RETURN(src_tensor->data());
|
||||
CHECK_NULL_RETURN(dst_tensor->data());
|
||||
// need replace with increase data ref count
|
||||
MS_CHECK_FALSE(src_tensor->Size() == 0, RET_ERROR);
|
||||
memcpy(dst_tensor->data(), src_tensor->data(), src_tensor->Size());
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
#ifndef CONTROLFLOW_TENSORLIST_CLIP
|
||||
int CarryDataKernel::MoveTensorListData(lite::TensorList *dst_tensorlist, lite::TensorList *src_tensorlist) {
|
||||
// shape may change, because tensors.size() can be change in RunGraph
|
||||
if (dst_tensorlist->data_type() != src_tensorlist->data_type() ||
|
||||
dst_tensorlist->format() != src_tensorlist->format()) {
|
||||
MS_LOG(ERROR) << "input tensorlist and output tensorlist data_type or format is incompatible";
|
||||
MS_LOG(ERROR) << "input tensor data_type: " << src_tensorlist->data_type() << " vs "
|
||||
<< "output tensor data_type: " << dst_tensorlist->data_type()
|
||||
<< "input tensor format: " << src_tensorlist->format() << " vs "
|
||||
<< "output tensor format: " << dst_tensorlist->format();
|
||||
return RET_ERROR;
|
||||
}
|
||||
// when tensorlist malloc is done. this need to check element_shape compatibility
|
||||
dst_tensorlist->set_element_shape(src_tensorlist->element_shape());
|
||||
|
||||
auto update_data_type = kTypeUnknown;
|
||||
auto dst_tensor_data_type = dst_tensorlist->tensors_data_type();
|
||||
auto src_tensor_data_type = src_tensorlist->tensors_data_type();
|
||||
if (dst_tensor_data_type != src_tensor_data_type) {
|
||||
if (src_tensor_data_type != kTypeUnknown && dst_tensor_data_type != kTypeUnknown) {
|
||||
MS_LOG(ERROR) << "input tensorlist and output tensorlist is incompatible";
|
||||
return RET_ERROR;
|
||||
}
|
||||
update_data_type = dst_tensor_data_type != kTypeUnknown ? dst_tensor_data_type : src_tensor_data_type;
|
||||
}
|
||||
if (update_data_type != kTypeUnknown) {
|
||||
src_tensorlist->set_tensors_data_type(update_data_type);
|
||||
dst_tensorlist->set_tensors_data_type(update_data_type);
|
||||
}
|
||||
size_t src_tensorlist_tensors_size = src_tensorlist->tensors().size();
|
||||
for (size_t i = 0; i < src_tensorlist_tensors_size; ++i) {
|
||||
auto &src_tensor = src_tensorlist->tensors()[i];
|
||||
auto &dst_tensor = dst_tensorlist->tensors()[i];
|
||||
|
||||
if (src_tensor->allocator() != nullptr) {
|
||||
src_tensor->allocator()->IncRefCount(src_tensor->data(), dst_tensor->ref_count());
|
||||
}
|
||||
dst_tensor->set_own_data(src_tensor->own_data());
|
||||
if (src_tensor->data() != nullptr) {
|
||||
dst_tensor->set_data(src_tensor->data());
|
||||
}
|
||||
dst_tensor->set_shape(src_tensor->shape());
|
||||
}
|
||||
return RET_OK;
|
||||
}
|
||||
#endif
|
||||
} // namespace mindspore::kernel
|
|
@ -1,46 +0,0 @@
|
|||
/**
|
||||
* Copyright 2020 Huawei Technologies Co., Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef MINDSPORE_LITE_SRC_RUNTIME_KERNEL_ARM_BASE_CARRY_DATA_H_
|
||||
#define MINDSPORE_LITE_SRC_RUNTIME_KERNEL_ARM_BASE_CARRY_DATA_H_
|
||||
|
||||
#include <vector>
|
||||
#include "src/inner_kernel.h"
|
||||
#include "src/tensor.h"
|
||||
#ifndef CONTROLFLOW_TENSORLIST_CLIP
|
||||
#include "src/tensorlist.h"
|
||||
#endif
|
||||
|
||||
namespace mindspore::kernel {
|
||||
class CarryDataKernel : public InnerKernel {
|
||||
public:
|
||||
CarryDataKernel(OpParameter *parameter, const std::vector<lite::Tensor *> &inputs,
|
||||
const std::vector<lite::Tensor *> &outputs, const lite::InnerContext *ctx)
|
||||
: InnerKernel(parameter, inputs, outputs, ctx) {}
|
||||
~CarryDataKernel() override = default;
|
||||
|
||||
protected:
|
||||
int MoveData(const std::vector<lite::Tensor *>::iterator &dst_begin,
|
||||
const std::vector<lite::Tensor *>::iterator &dst_end,
|
||||
const std::vector<lite::Tensor *>::iterator &src_begin,
|
||||
const std::vector<lite::Tensor *>::iterator &src_limit);
|
||||
int MoveTensorData(lite::Tensor *dst_tensor, lite::Tensor *src_tensor);
|
||||
#ifndef CONTROLFLOW_TENSORLIST_CLIP
|
||||
int MoveTensorListData(lite::TensorList *dst_tensorlist, lite::TensorList *src_tensorlist);
|
||||
#endif
|
||||
};
|
||||
} // namespace mindspore::kernel
|
||||
|
||||
#endif // MINDSPORE_LITE_SRC_RUNTIME_KERNEL_ARM_BASE_CARRY_DATA_H_
|
|
@ -79,7 +79,7 @@ class ConvolutionBaseCPUKernel : public InnerKernel {
|
|||
|
||||
virtual int MallocWeightBiasData() { return RET_OK; }
|
||||
virtual void PackWeight() {}
|
||||
bool IsRepack() { return is_repack_; }
|
||||
bool IsRepack() const { return is_repack_; }
|
||||
std::unordered_map<uintptr_t, void *> addr_map;
|
||||
void *packed_weight_ = nullptr;
|
||||
#ifdef SERVER_INFERENCE
|
||||
|
|
|
@ -55,7 +55,7 @@ int GroupConvolutionBaseCPUKernel::ReSize() {
|
|||
return RET_OK;
|
||||
}
|
||||
|
||||
void GroupConvolutionBaseCPUKernel::FreeSubKernel() {
|
||||
GroupConvolutionBaseCPUKernel::~GroupConvolutionBaseCPUKernel() {
|
||||
for (auto &sub_conv : group_convs_) {
|
||||
// free sub conv input tensors / output tensors manually
|
||||
auto sub_in_tensors = sub_conv->in_tensors();
|
||||
|
@ -102,7 +102,6 @@ int GroupConvolutionBaseCPUKernel::PreProcess() {
|
|||
sub_kernel_in_tensor->set_shape(in_shape);
|
||||
ret = sub_kernel_in_tensor->MallocData();
|
||||
if (ret != RET_OK) {
|
||||
FreeSubKernel();
|
||||
MS_LOG(ERROR) << "sub kernel in tensor malloc data failed.";
|
||||
return ret;
|
||||
}
|
||||
|
@ -116,7 +115,6 @@ int GroupConvolutionBaseCPUKernel::PreProcess() {
|
|||
tensor->set_shape(out_shape);
|
||||
ret = tensor->MallocData();
|
||||
if (ret != RET_OK) {
|
||||
FreeSubKernel();
|
||||
MS_LOG(ERROR) << "sub kernel out tensor malloc data failed.";
|
||||
return ret;
|
||||
}
|
||||
|
@ -134,7 +132,6 @@ int GroupConvolutionBaseCPUKernel::PreProcess() {
|
|||
CHECK_NULL_RETURN(output);
|
||||
auto ret = output->MallocData();
|
||||
if (ret != RET_OK) {
|
||||
FreeSubKernel();
|
||||
MS_LOG(ERROR) << "group conv out tensor malloc data failed.";
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -35,7 +35,7 @@ class GroupConvolutionBaseCPUKernel : public ConvolutionBaseCPUKernel {
|
|||
group_conv_creator_(group_conv_creator),
|
||||
group_num_(group_num) {} // opParameter(in channel, out channel) in this kernel has been split to groups, if
|
||||
// you want to get real params, multiply in channel / out channel with group num
|
||||
~GroupConvolutionBaseCPUKernel() override { FreeSubKernel(); }
|
||||
~GroupConvolutionBaseCPUKernel() override;
|
||||
|
||||
int Prepare() override;
|
||||
int ReSize() override;
|
||||
|
|
|
@ -81,7 +81,8 @@ lite::Tensor *CreateConstTensor(const lite::Tensor *tensor, const std::vector<in
|
|||
MS_LOG(ERROR) << "Tensor data size should not be 0.";
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t *new_tensor_data = reinterpret_cast<uint8_t *>(tensor->data()) + index * new_tensor->Size();
|
||||
void *new_tensor_data =
|
||||
reinterpret_cast<void *>(reinterpret_cast<uint8_t *>(tensor->data()) + index * new_tensor->Size());
|
||||
memcpy(new_tensor->data(), reinterpret_cast<void *>(new_tensor_data), new_tensor->Size());
|
||||
return new_tensor;
|
||||
}
|
||||
|
@ -141,7 +142,7 @@ int GroupConvCreator::NewInputTensor(std::vector<lite::Tensor *> *tensors) {
|
|||
return lite::RET_OK;
|
||||
}
|
||||
|
||||
int GroupConvCreator::NewOutputTensor(std::vector<lite::Tensor *> *tensors, lite::Tensor *output) {
|
||||
int GroupConvCreator::NewOutputTensor(std::vector<lite::Tensor *> *tensors, const lite::Tensor *output) const {
|
||||
auto out_tensor = CreateVarTensor({output_shape_, output->format(), data_type_, output->category(), false}, infered_);
|
||||
if (out_tensor == nullptr) {
|
||||
return lite::RET_ERROR;
|
||||
|
|
|
@ -35,12 +35,11 @@ struct TensorInfo {
|
|||
class GroupConvCreator {
|
||||
public:
|
||||
GroupConvCreator(std::vector<lite::Tensor *> inputs, std::vector<lite::Tensor *> outputs, OpParameter *op_parameter,
|
||||
const lite::InnerContext *ctx, bool is_quant, TypeId data_type)
|
||||
bool is_quant, TypeId data_type)
|
||||
: origin_inputs_(std::move(inputs)),
|
||||
origin_outputs_(std::move(outputs)),
|
||||
is_quant_(is_quant),
|
||||
data_type_(data_type),
|
||||
ctx_(ctx) {
|
||||
data_type_(data_type) {
|
||||
auto shape = origin_outputs_.front()->shape();
|
||||
infered_ = std::find(shape.begin(), shape.end(), -1) == shape.end();
|
||||
conv_param_ = reinterpret_cast<ConvParameter *>(op_parameter);
|
||||
|
@ -48,10 +47,8 @@ class GroupConvCreator {
|
|||
|
||||
~GroupConvCreator() = default;
|
||||
|
||||
public:
|
||||
void SetShapeOfTensors();
|
||||
int CreateConvs(std::vector<kernel::InnerKernel *> *group_convs);
|
||||
std::vector<kernel::InnerKernel *> *get_group_conv() { return &group_convs_; }
|
||||
void CopyQuantParam(const std::vector<lite::Tensor *> *tensors);
|
||||
int GetSingleConvParam(ConvParameter *conv_param, std::vector<lite::Tensor *> *new_inputs,
|
||||
std::vector<lite::Tensor *> *new_outputs, int group_id);
|
||||
|
@ -64,7 +61,7 @@ class GroupConvCreator {
|
|||
void FreeGroupConvs();
|
||||
int NewInputTensor(std::vector<lite::Tensor *> *tensors);
|
||||
int NewConstTensor(std::vector<lite::Tensor *> *tensors, int group_id);
|
||||
int NewOutputTensor(std::vector<lite::Tensor *> *tensors, lite::Tensor *output);
|
||||
int NewOutputTensor(std::vector<lite::Tensor *> *tensors, const lite::Tensor *output) const;
|
||||
|
||||
private:
|
||||
std::vector<lite::Tensor *> origin_inputs_;
|
||||
|
@ -78,7 +75,6 @@ class GroupConvCreator {
|
|||
bool infered_ = false;
|
||||
bool is_quant_ = false;
|
||||
TypeId data_type_;
|
||||
const lite::InnerContext *ctx_ = nullptr;
|
||||
};
|
||||
|
||||
ConvParameter *CreateNewConvParameter(const ConvParameter *parameter);
|
||||
|
|
|
@ -87,7 +87,6 @@ int OneHotCPUKernel::ReSize() {
|
|||
}
|
||||
|
||||
int RunOneHot(void *cdata, int task_id, float lhs_scale, float rhs_scale) {
|
||||
CHECK_NULL_RETURN(cdata);
|
||||
auto onehot_kernel = reinterpret_cast<OneHotCPUKernel *>(cdata);
|
||||
if (onehot_kernel == nullptr) {
|
||||
MS_LOG(ERROR) << "cast OneHotCPUKernel failed";
|
||||
|
|
|
@ -41,7 +41,6 @@ class OneHotCPUKernel : public InnerKernel {
|
|||
int InitOnOffValueForThreeInputs();
|
||||
int InitOnOffValueForFourInputs();
|
||||
|
||||
private:
|
||||
int thread_num_ = 1;
|
||||
int axis_ = 0;
|
||||
int outer_size_ = 0;
|
||||
|
|
|
@ -33,8 +33,6 @@ class PartialFusionKernel : public InnerKernel {
|
|||
int Run() override;
|
||||
void set_subgraph_kernels(const std::vector<LiteKernel *> &subgraph_kernels) { subgraph_kernels_ = subgraph_kernels; }
|
||||
std::vector<LiteKernel *> subgraph_kernels() const { return subgraph_kernels_; }
|
||||
|
||||
private:
|
||||
// One partial corresponds to a subgraph at offline stage, after graph schedule, a subgraph may be split into many
|
||||
// graphs, so use a vector.
|
||||
std::vector<LiteKernel *> subgraph_kernels_{};
|
||||
|
|
|
@ -30,7 +30,7 @@ class PoolingBaseCPUKernel : public InnerKernel {
|
|||
public:
|
||||
PoolingBaseCPUKernel(OpParameter *parameter, const std::vector<lite::Tensor *> &inputs,
|
||||
const std::vector<lite::Tensor *> &outputs, const InnerContext *ctx)
|
||||
: InnerKernel(parameter, inputs, outputs, ctx), ctx_(ctx), thread_count_(ctx->thread_num_) {
|
||||
: InnerKernel(parameter, inputs, outputs, ctx), thread_count_(ctx->thread_num_) {
|
||||
pooling_param_ = reinterpret_cast<PoolingParameter *>(op_parameter_);
|
||||
}
|
||||
~PoolingBaseCPUKernel() = default;
|
||||
|
@ -42,7 +42,6 @@ class PoolingBaseCPUKernel : public InnerKernel {
|
|||
void FreeQuantParam();
|
||||
|
||||
protected:
|
||||
const InnerContext *ctx_;
|
||||
int thread_count_;
|
||||
PoolingParameter *pooling_param_ = nullptr;
|
||||
QuantArg **pooling_quant_arg_ = nullptr;
|
||||
|
|
|
@ -159,12 +159,11 @@ int PriorBoxCPUKernel::GeneratePriorBox() {
|
|||
|
||||
int PriorBoxCPUKernel::PriorBoxImpl(int task_id) {
|
||||
auto src = output_.data();
|
||||
MS_CHECK_TRUE_RET(src != nullptr, RET_NULL_PTR);
|
||||
CHECK_NULL_RETURN(src);
|
||||
auto output = out_tensors_.at(0);
|
||||
CHECK_NULL_RETURN(output);
|
||||
MS_CHECK_TRUE_RET(output != nullptr, RET_NULL_PTR);
|
||||
auto output_data = reinterpret_cast<float *>(output->data());
|
||||
MS_CHECK_TRUE_RET(output_data != nullptr, RET_NULL_PTR);
|
||||
CHECK_NULL_RETURN(output_data);
|
||||
auto ret = PriorBox(src, output_data, output_.size(), task_id, thread_count_);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -106,7 +106,7 @@ int ReduceBaseCPUKernel::Prepare() {
|
|||
MS_CHECK_FALSE_MSG((axes_tensor->data_type() != kNumberTypeInt && axes_tensor->data_type() != kNumberTypeInt32),
|
||||
RET_ERROR, "The data type of axes tensor should be int32");
|
||||
num_axes_ = axes_tensor->ElementsNum();
|
||||
if (num_axes_ <= 0 && num_axes_ > MAX_SHAPE_SIZE) {
|
||||
if (num_axes_ <= 0 || num_axes_ > MAX_SHAPE_SIZE) {
|
||||
MS_LOG(ERROR) << "input axes invalid.";
|
||||
return RET_ERROR;
|
||||
}
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
|
||||
#include <vector>
|
||||
#include "src/inner_kernel.h"
|
||||
|
||||
#include "nnacl/reduce_parameter.h"
|
||||
|
||||
namespace mindspore::kernel {
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
#include "src/inner_kernel.h"
|
||||
#include "include/context.h"
|
||||
#include "include/errorcode.h"
|
||||
#include "src/runtime/kernel/arm/base/carry_data.h"
|
||||
|
||||
using mindspore::lite::InnerContext;
|
||||
namespace mindspore::kernel {
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
|
||||
using mindspore::lite::KernelRegistrar;
|
||||
using mindspore::lite::RET_ERROR;
|
||||
using mindspore::lite::RET_NOT_SUPPORT;
|
||||
using mindspore::lite::RET_NULL_PTR;
|
||||
using mindspore::lite::RET_OK;
|
||||
using mindspore::schema::PrimitiveType_Select;
|
||||
|
@ -34,6 +35,121 @@ int SelectCPUKernel::Prepare() { return RET_OK; }
|
|||
|
||||
int SelectCPUKernel::ReSize() { return RET_OK; }
|
||||
|
||||
int MoveTensorData(lite::Tensor *dst_tensor, const lite::Tensor *src_tensor) {
|
||||
if (dst_tensor->data_type() != src_tensor->data_type() || dst_tensor->format() != src_tensor->format() ||
|
||||
!(dst_tensor->shape() == src_tensor->shape() || (dst_tensor->shape().empty() && src_tensor->shape().empty()))) {
|
||||
MS_LOG(ERROR) << "input tensor and output tensor is incompatible.";
|
||||
MS_LOG(ERROR) << "input tensor data_type: " << src_tensor->data_type() << " vs "
|
||||
<< "output tensor data_type: " << dst_tensor->data_type()
|
||||
<< "input tensor format: " << src_tensor->format() << " vs "
|
||||
<< "output tensor format: " << dst_tensor->format() << " input tensor shape: " << src_tensor->shape()
|
||||
<< " vs "
|
||||
<< "output tensor shape: " << dst_tensor->shape();
|
||||
return RET_ERROR;
|
||||
}
|
||||
if (src_tensor->allocator() == nullptr) {
|
||||
MS_LOG(ERROR) << "src_tensor allocator is nullptr.";
|
||||
return RET_ERROR;
|
||||
}
|
||||
|
||||
CHECK_NULL_RETURN(src_tensor->data());
|
||||
CHECK_NULL_RETURN(dst_tensor->data());
|
||||
// need replace with increase data ref count
|
||||
MS_CHECK_FALSE(src_tensor->Size() == 0, RET_ERROR);
|
||||
(void)memcpy(dst_tensor->data(), src_tensor->data(), src_tensor->Size());
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
#ifndef CONTROLFLOW_TENSORLIST_CLIP
|
||||
int MoveTensorListData(lite::TensorList *dst_tensorlist, lite::TensorList *src_tensorlist) {
|
||||
// shape may change, because tensors.size() can be change in RunGraph
|
||||
if (dst_tensorlist->data_type() != src_tensorlist->data_type() ||
|
||||
dst_tensorlist->format() != src_tensorlist->format()) {
|
||||
MS_LOG(ERROR) << "input tensorlist and output tensorlist data_type or format is incompatible";
|
||||
MS_LOG(ERROR) << "input tensor data_type: " << src_tensorlist->data_type() << " vs "
|
||||
<< "output tensor data_type: " << dst_tensorlist->data_type()
|
||||
<< "input tensor format: " << src_tensorlist->format() << " vs "
|
||||
<< "output tensor format: " << dst_tensorlist->format();
|
||||
return RET_ERROR;
|
||||
}
|
||||
// when tensorlist malloc is done. this need to check element_shape compatibility
|
||||
dst_tensorlist->set_element_shape(src_tensorlist->element_shape());
|
||||
|
||||
auto update_data_type = kTypeUnknown;
|
||||
auto dst_tensor_data_type = dst_tensorlist->tensors_data_type();
|
||||
auto src_tensor_data_type = src_tensorlist->tensors_data_type();
|
||||
if (dst_tensor_data_type != src_tensor_data_type) {
|
||||
if (src_tensor_data_type != kTypeUnknown && dst_tensor_data_type != kTypeUnknown) {
|
||||
MS_LOG(ERROR) << "input tensorlist and output tensorlist is incompatible";
|
||||
return RET_ERROR;
|
||||
}
|
||||
update_data_type = dst_tensor_data_type != kTypeUnknown ? dst_tensor_data_type : src_tensor_data_type;
|
||||
}
|
||||
if (update_data_type != kTypeUnknown) {
|
||||
src_tensorlist->set_tensors_data_type(update_data_type);
|
||||
dst_tensorlist->set_tensors_data_type(update_data_type);
|
||||
}
|
||||
size_t src_tensorlist_tensors_size = src_tensorlist->tensors().size();
|
||||
for (size_t i = 0; i < src_tensorlist_tensors_size; ++i) {
|
||||
auto &src_tensor = src_tensorlist->tensors()[i];
|
||||
auto &dst_tensor = dst_tensorlist->tensors()[i];
|
||||
|
||||
if (src_tensor->allocator() != nullptr) {
|
||||
src_tensor->allocator()->IncRefCount(src_tensor->data(), dst_tensor->ref_count());
|
||||
}
|
||||
dst_tensor->set_own_data(src_tensor->own_data());
|
||||
if (src_tensor->data() != nullptr) {
|
||||
dst_tensor->set_data(src_tensor->data());
|
||||
}
|
||||
dst_tensor->set_shape(src_tensor->shape());
|
||||
}
|
||||
return RET_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
int MoveData(const std::vector<lite::Tensor *>::iterator &dst_begin,
|
||||
const std::vector<lite::Tensor *>::iterator &dst_end,
|
||||
const std::vector<lite::Tensor *>::iterator &src_begin,
|
||||
const std::vector<lite::Tensor *>::iterator &src_limit) {
|
||||
for (auto dst_iter = dst_begin, src_iter = src_begin; dst_iter != dst_end; dst_iter++, src_iter++) {
|
||||
if (src_iter == src_limit) {
|
||||
MS_LOG(ERROR) << "out of range of input tensor";
|
||||
return RET_ERROR;
|
||||
}
|
||||
auto *dst_tensor = *dst_iter;
|
||||
auto *src_tensor = *src_iter;
|
||||
if (dst_tensor == nullptr || src_tensor == nullptr) {
|
||||
MS_LOG(ERROR) << "input tensor or output tensor of merge is nullptr";
|
||||
return RET_ERROR;
|
||||
}
|
||||
lite::STATUS ret = RET_OK;
|
||||
if (src_tensor->IsConst() || src_tensor->IsGraphInput()) {
|
||||
MS_LOG(DEBUG) << "Carry const data and graph inputs.";
|
||||
dst_tensor->set_data(src_tensor->data());
|
||||
dst_tensor->set_own_data(false);
|
||||
} else {
|
||||
if (src_tensor->data_type() == kObjectTypeTensorType && dst_tensor->data_type() == kObjectTypeTensorType) {
|
||||
#ifndef CONTROLFLOW_TENSORLIST_CLIP
|
||||
MS_LOG(DEBUG) << "Carry MoveTensorListData";
|
||||
ret = MoveTensorListData(reinterpret_cast<lite::TensorList *>(dst_tensor),
|
||||
reinterpret_cast<lite::TensorList *>(src_tensor));
|
||||
#else
|
||||
MS_LOG(ERROR) << unsupport_controlflow_tensorlist_log;
|
||||
return RET_NOT_SUPPORT;
|
||||
#endif
|
||||
} else {
|
||||
MS_LOG(DEBUG) << "Carry MoveTensorData";
|
||||
ret = MoveTensorData(dst_tensor, src_tensor);
|
||||
}
|
||||
}
|
||||
if (ret != RET_OK) {
|
||||
MS_LOG(ERROR) << "Move data failed : " << ret;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
// inputs: bool*1 true-data*n false-data*n
|
||||
// output: data*n
|
||||
int SelectCPUKernel::Run() {
|
||||
|
|
|
@ -17,18 +17,17 @@
|
|||
#define MINDSPORE_LITE_SRC_RUNTIME_KERNEL_ARM_BASE_SELECT_H_
|
||||
|
||||
#include <vector>
|
||||
#include "src/runtime/kernel/arm/base/carry_data.h"
|
||||
#include "src/inner_kernel.h"
|
||||
#ifndef CONTROLFLOW_TENSORLIST_CLIP
|
||||
#include "src/tensorlist.h"
|
||||
#endif
|
||||
|
||||
namespace mindspore::kernel {
|
||||
class SelectCPUKernel : public CarryDataKernel {
|
||||
class SelectCPUKernel : public InnerKernel {
|
||||
public:
|
||||
SelectCPUKernel(OpParameter *parameter, const std::vector<lite::Tensor *> &inputs,
|
||||
const std::vector<lite::Tensor *> &outputs, const lite::InnerContext *ctx)
|
||||
: CarryDataKernel(parameter, inputs, outputs, ctx) {}
|
||||
: InnerKernel(parameter, inputs, outputs, ctx) {}
|
||||
~SelectCPUKernel() override = default;
|
||||
int Prepare() override;
|
||||
int ReSize() override;
|
||||
|
|
|
@ -33,8 +33,6 @@ class SliceCPUKernel : public InnerKernel {
|
|||
int Prepare() override;
|
||||
int ReSize() override;
|
||||
int Run() override;
|
||||
|
||||
public:
|
||||
int SliceParallelRun(int thread_id);
|
||||
|
||||
protected:
|
||||
|
|
|
@ -26,7 +26,7 @@ class SoftmaxBaseCPUKernel : public InnerKernel {
|
|||
public:
|
||||
SoftmaxBaseCPUKernel(OpParameter *parameter, const std::vector<lite::Tensor *> &inputs,
|
||||
const std::vector<lite::Tensor *> &outputs, const lite::InnerContext *ctx)
|
||||
: InnerKernel(parameter, inputs, outputs, ctx), ctx_(ctx), thread_count_(ctx->thread_num_) {
|
||||
: InnerKernel(parameter, inputs, outputs, ctx), thread_count_(ctx->thread_num_) {
|
||||
softmax_param_ = reinterpret_cast<SoftmaxParameter *>(op_parameter_);
|
||||
}
|
||||
~SoftmaxBaseCPUKernel() = default;
|
||||
|
@ -36,7 +36,6 @@ class SoftmaxBaseCPUKernel : public InnerKernel {
|
|||
int Run() override { return 0; }
|
||||
|
||||
protected:
|
||||
const lite::InnerContext *ctx_;
|
||||
int thread_count_;
|
||||
SoftmaxParameter *softmax_param_;
|
||||
};
|
||||
|
|
|
@ -41,8 +41,6 @@ class SplitBaseCPUKernel : public InnerKernel {
|
|||
int Prepare() override;
|
||||
int ReSize() override;
|
||||
int Run() override;
|
||||
|
||||
public:
|
||||
virtual int Split(int task_id);
|
||||
static int CheckAndInitSplitParam(const lite::Tensor &in_tensor, SplitParameter *param);
|
||||
|
||||
|
|
|
@ -25,9 +25,9 @@ using mindspore::lite::RET_ERROR;
|
|||
using mindspore::lite::RET_NULL_PTR;
|
||||
using mindspore::lite::RET_OK;
|
||||
using mindspore::schema::PrimitiveType_SplitWithOverlap;
|
||||
#define MIN_NUM_SPLIT 2
|
||||
|
||||
namespace mindspore::kernel {
|
||||
const int MIN_NUM_SPLIT = 2;
|
||||
|
||||
int SplitWithOverlapBaseCPUKernel::CalculateSplitedShapes(const std::vector<int> &shape) {
|
||||
int total_block_count = 0;
|
||||
|
|
|
@ -41,7 +41,6 @@ class SplitWithOverlapBaseCPUKernel : public InnerKernel {
|
|||
private:
|
||||
int CalculateSplitedShapes(const std::vector<int> &shape);
|
||||
|
||||
private:
|
||||
// range: [start, end)
|
||||
std::vector<int> start_indices_;
|
||||
std::vector<int> end_indices_;
|
||||
|
|
|
@ -68,7 +68,6 @@ int StackBaseCPUKernel::ReSize() {
|
|||
copy_size_ = GetCopyNum(input0_shape, axis_, input0_shape.size()) * data_type_size_;
|
||||
outer_size_ = GetOuterSize(input0_shape, axis_);
|
||||
}
|
||||
MS_CHECK_GT(copy_size_, 0, RET_ERROR);
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
@ -83,7 +82,7 @@ int StackBaseCPUKernel::Prepare() {
|
|||
return ReSize();
|
||||
}
|
||||
|
||||
int StackBaseCPUKernel::Execute(int task_id) {
|
||||
int StackBaseCPUKernel::StackExecute(int task_id) {
|
||||
auto output_data = reinterpret_cast<void *>(out_tensors_.at(0)->data());
|
||||
if (output_data == nullptr) {
|
||||
return RET_NULL_PTR;
|
||||
|
@ -103,7 +102,7 @@ int StackBaseCPUKernel::Execute(int task_id) {
|
|||
static int StackRun(void *cdata, int task_id, float lhs_scale, float rhs_scale) {
|
||||
CHECK_NULL_RETURN(cdata);
|
||||
auto stack = reinterpret_cast<StackBaseCPUKernel *>(cdata);
|
||||
if (stack->Execute(task_id) != RET_OK) {
|
||||
if (stack->StackExecute(task_id) != RET_OK) {
|
||||
return RET_ERROR;
|
||||
}
|
||||
return RET_OK;
|
||||
|
|
|
@ -34,7 +34,7 @@ class StackBaseCPUKernel : public InnerKernel {
|
|||
int Prepare() override;
|
||||
int ReSize() override;
|
||||
int Run() override;
|
||||
int Execute(int task_id);
|
||||
int StackExecute(int task_id);
|
||||
|
||||
protected:
|
||||
StackParameter *stack_param_ = nullptr;
|
||||
|
|
|
@ -202,7 +202,7 @@ kernel::InnerKernel *CpuGroupConvFp16KernelCreator(const std::vector<lite::Tenso
|
|||
const std::vector<lite::Tensor *> &outputs,
|
||||
OpParameter *op_parameter, const InnerContext *ctx) {
|
||||
auto *group_conv_creator =
|
||||
new (std::nothrow) GroupConvCreator(inputs, outputs, op_parameter, ctx, false, kNumberTypeFloat16);
|
||||
new (std::nothrow) GroupConvCreator(inputs, outputs, op_parameter, false, kNumberTypeFloat16);
|
||||
if (group_conv_creator == nullptr) {
|
||||
MS_LOG(ERROR) << "new GroupConvCreator fail";
|
||||
free(op_parameter);
|
||||
|
|
|
@ -289,7 +289,7 @@ kernel::InnerKernel *CpuConvDwFp32KernelCreator(const std::vector<lite::Tensor *
|
|||
kernel::InnerKernel *CpuGroupConvFp32KernelCreator(const std::vector<lite::Tensor *> &inputs,
|
||||
const std::vector<lite::Tensor *> &outputs,
|
||||
OpParameter *op_parameter, const lite::InnerContext *ctx) {
|
||||
auto *group_conv_creator = new GroupConvCreator(inputs, outputs, op_parameter, ctx, false, kNumberTypeFloat32);
|
||||
auto *group_conv_creator = new GroupConvCreator(inputs, outputs, op_parameter, false, kNumberTypeFloat32);
|
||||
auto group_kernel = new (std::nothrow) GroupConvolutionFp32CPUKernel(
|
||||
op_parameter, inputs, outputs, ctx, group_conv_creator, reinterpret_cast<ConvParameter *>(op_parameter)->group_);
|
||||
if (group_kernel == nullptr) {
|
||||
|
|
|
@ -108,7 +108,7 @@ kernel::InnerKernel *CpuGroupConvInt8KernelCreator(const std::vector<lite::Tenso
|
|||
<< conv_param->input_channel_;
|
||||
return nullptr;
|
||||
}
|
||||
auto *group_conv_creator = new GroupConvCreator(inputs, outputs, op_parameter, ctx, true, kNumberTypeInt8);
|
||||
auto *group_conv_creator = new GroupConvCreator(inputs, outputs, op_parameter, true, kNumberTypeInt8);
|
||||
return new (std::nothrow)
|
||||
GroupConvolutionInt8CPUKernel(op_parameter, inputs, outputs, ctx, group_conv_creator, group);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue