From: @zhujingxuan Reviewed-by: @wangchengyuan,@jpc_chenjianping Signed-off-by: @wangchengyuanpull/13840/MERGE
| @@ -39,11 +39,19 @@ typedef struct { | |||||
| } NpuDeviceInfo; | } NpuDeviceInfo; | ||||
| /// \brief DeviceInfo defined for backend's configuration information. | /// \brief DeviceInfo defined for backend's configuration information. | ||||
| #ifdef NOT_USE_STL | |||||
| // DeviceInfo() is implicitly deleted because | |||||
| // the default definition of union struct would be ill-formed | |||||
| struct DeviceInfo { | |||||
| CpuDeviceInfo cpu_device_info_; | |||||
| }; | |||||
| #else | |||||
| union DeviceInfo { | union DeviceInfo { | ||||
| CpuDeviceInfo cpu_device_info_; | CpuDeviceInfo cpu_device_info_; | ||||
| GpuDeviceInfo gpu_device_info_; | GpuDeviceInfo gpu_device_info_; | ||||
| NpuDeviceInfo npu_device_info_; | NpuDeviceInfo npu_device_info_; | ||||
| }; | }; | ||||
| #endif // NOT_USE_STL | |||||
| /// \brief DeviceContext defined for holding backend's configuration information. | /// \brief DeviceContext defined for holding backend's configuration information. | ||||
| struct DeviceContext { | struct DeviceContext { | ||||
| @@ -27,6 +27,7 @@ | |||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <string.h> | #include <string.h> | ||||
| #include <stddef.h> | #include <stddef.h> | ||||
| #include <new> | |||||
| #endif // NOT_USE_STL | #endif // NOT_USE_STL | ||||
| #ifndef MS_API | #ifndef MS_API | ||||
| @@ -126,22 +127,21 @@ class Vector { | |||||
| size_ = size; | size_ = size; | ||||
| elem_size_ = sizeof(T); | elem_size_ = sizeof(T); | ||||
| capacity_ = (size == 0 ? DEFAULT_CAPACITY : size); | capacity_ = (size == 0 ? DEFAULT_CAPACITY : size); | ||||
| data_ = reinterpret_cast<T *>(malloc(capacity_ * elem_size_)); | |||||
| data_ = new (std::nothrow) T[capacity_]; | |||||
| if (data_ == nullptr) { | if (data_ == nullptr) { | ||||
| MS_C_EXCEPTION("malloc data failed"); | MS_C_EXCEPTION("malloc data failed"); | ||||
| } | } | ||||
| memset(data_, 0, capacity_ * elem_size_); | |||||
| } | } | ||||
| Vector(size_t size, const T &value) { | Vector(size_t size, const T &value) { | ||||
| size_ = size; | size_ = size; | ||||
| elem_size_ = sizeof(T); | elem_size_ = sizeof(T); | ||||
| capacity_ = (size == 0 ? DEFAULT_CAPACITY : size); | capacity_ = (size == 0 ? DEFAULT_CAPACITY : size); | ||||
| data_ = reinterpret_cast<T *>(malloc(capacity_ * elem_size_)); | |||||
| data_ = new (std::nothrow) T[capacity_]; | |||||
| if (data_ == nullptr) { | if (data_ == nullptr) { | ||||
| MS_C_EXCEPTION("malloc data failed"); | MS_C_EXCEPTION("malloc data failed"); | ||||
| } | } | ||||
| for (int i = 0; i < size; ++i) { | |||||
| for (int i = 0; i < static_cast<int>(size_); ++i) { | |||||
| data_[i] = value; | data_[i] = value; | ||||
| } | } | ||||
| } | } | ||||
| @@ -150,30 +150,32 @@ class Vector { | |||||
| size_ = vec.size_; | size_ = vec.size_; | ||||
| elem_size_ = sizeof(T); | elem_size_ = sizeof(T); | ||||
| capacity_ = vec.capacity_; | capacity_ = vec.capacity_; | ||||
| data_ = reinterpret_cast<T *>(malloc(capacity_ * elem_size_)); | |||||
| data_ = new (std::nothrow) T[capacity_]; | |||||
| if (data_ == nullptr) { | if (data_ == nullptr) { | ||||
| MS_C_EXCEPTION("malloc data failed"); | MS_C_EXCEPTION("malloc data failed"); | ||||
| } | } | ||||
| memcpy(data_, vec.data_, size_ * elem_size_); | |||||
| for (int i = 0; i < static_cast<int>(size_); ++i) { | |||||
| data_[i] = vec.data_[i]; | |||||
| } | |||||
| } | } | ||||
| ~Vector() { | ~Vector() { | ||||
| if (data_ != nullptr) { | if (data_ != nullptr) { | ||||
| free(data_); | |||||
| delete[] data_; | |||||
| } | } | ||||
| } | } | ||||
| void clear() { | void clear() { | ||||
| size_ = 0; | size_ = 0; | ||||
| if (data_ != nullptr) { | if (data_ != nullptr) { | ||||
| free(data_); | |||||
| delete[] data_; | |||||
| data_ = nullptr; | data_ = nullptr; | ||||
| } | } | ||||
| } | } | ||||
| void push_back(const T &elem) { | void push_back(const T &elem) { | ||||
| if (data_ == nullptr) { | if (data_ == nullptr) { | ||||
| data_ = reinterpret_cast<T *>(malloc(capacity_ * elem_size_)); | |||||
| data_ = new (std::nothrow) T[capacity_]; | |||||
| if (data_ == nullptr) { | if (data_ == nullptr) { | ||||
| MS_C_EXCEPTION("malloc data failed"); | MS_C_EXCEPTION("malloc data failed"); | ||||
| } | } | ||||
| @@ -187,7 +189,7 @@ class Vector { | |||||
| void push_back(T &&elem) { | void push_back(T &&elem) { | ||||
| if (data_ == nullptr) { | if (data_ == nullptr) { | ||||
| data_ = reinterpret_cast<T *>(malloc(capacity_ * elem_size_)); | |||||
| data_ = new (std::nothrow) T[capacity_]; | |||||
| if (data_ == nullptr) { | if (data_ == nullptr) { | ||||
| MS_C_EXCEPTION("malloc data failed"); | MS_C_EXCEPTION("malloc data failed"); | ||||
| } | } | ||||
| @@ -216,7 +218,9 @@ class Vector { | |||||
| if (index == size_ - 1) { | if (index == size_ - 1) { | ||||
| push_back(elem); | push_back(elem); | ||||
| } else { | } else { | ||||
| memmove(data_ + index + 1, data_ + index, (size_ - index - 1) * elem_size_); | |||||
| for (int i = static_cast<int>(size_) - 1; i > static_cast<int>(index); --i) { | |||||
| data_[i + 1] = data_[i]; | |||||
| } | |||||
| data_[index] = elem; | data_[index] = elem; | ||||
| } | } | ||||
| } else { | } else { | ||||
| @@ -302,7 +306,9 @@ class Vector { | |||||
| if (index == size_ - 1) { | if (index == size_ - 1) { | ||||
| --size_; | --size_; | ||||
| } else if (index < size_) { | } else if (index < size_) { | ||||
| memmove(data_ + index, data_ + index + 1, (size_ - index - 1) * elem_size_); | |||||
| for (int i = index; i < static_cast<int>(size_); ++i) { | |||||
| data_[i] = data_[i + 1]; | |||||
| } | |||||
| --size_; | --size_; | ||||
| } else { | } else { | ||||
| MS_C_EXCEPTION("Input index is out of range!"); | MS_C_EXCEPTION("Input index is out of range!"); | ||||
| @@ -314,13 +320,15 @@ class Vector { | |||||
| capacity_ *= 2; | capacity_ *= 2; | ||||
| } | } | ||||
| T *tmp = data_; | T *tmp = data_; | ||||
| data_ = reinterpret_cast<T *>(malloc(capacity_ * elem_size_)); | |||||
| data_ = new (std::nothrow) T[capacity_]; | |||||
| if (data_ == nullptr) { | if (data_ == nullptr) { | ||||
| MS_C_EXCEPTION("malloc data failed"); | MS_C_EXCEPTION("malloc data failed"); | ||||
| } | } | ||||
| memcpy(data_, tmp, MIN(size, size_) * elem_size_); | |||||
| for (int i = 0; i < MIN(static_cast<int>(size), static_cast<int>(size_)); ++i) { | |||||
| data_[i] = tmp[i]; | |||||
| } | |||||
| size_ = size; | size_ = size; | ||||
| free(tmp); | |||||
| delete[] tmp; | |||||
| } | } | ||||
| void reserve(size_t capacity) { | void reserve(size_t capacity) { | ||||
| @@ -336,11 +344,13 @@ class Vector { | |||||
| size_ = vec.size_; | size_ = vec.size_; | ||||
| elem_size_ = sizeof(T); | elem_size_ = sizeof(T); | ||||
| capacity_ = vec.capacity_; | capacity_ = vec.capacity_; | ||||
| data_ = reinterpret_cast<T *>(malloc(capacity_ * elem_size_)); | |||||
| data_ = new (std::nothrow) T[capacity_]; | |||||
| if (data_ == nullptr) { | if (data_ == nullptr) { | ||||
| MS_C_EXCEPTION("malloc data failed"); | MS_C_EXCEPTION("malloc data failed"); | ||||
| } | } | ||||
| memcpy(data_, vec.data_, size_ * elem_size_); | |||||
| for (int i = 0; i < static_cast<int>(size_); ++i) { | |||||
| data_[i] = vec.data_[i]; | |||||
| } | |||||
| return *this; | return *this; | ||||
| } | } | ||||
| @@ -27,11 +27,13 @@ do | |||||
| done | done | ||||
| BASEPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" | BASEPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" | ||||
| MINDSPORE_ROOT_DIR=${${BASEPATH}%%/mindspore/lite/micro/example/mnist} | |||||
| MINDSPORE_ROOT_DIR=${${BASEPATH}%%/mindspore/lite/micro/example/mnist_x86} | |||||
| echo "current dir is: ${BASEPATH}" | echo "current dir is: ${BASEPATH}" | ||||
| INPUT_BIN=${BASEPATH}/mnist_input.bin | INPUT_BIN=${BASEPATH}/mnist_input.bin | ||||
| MNIST_NAME=mnist | |||||
| MNIST_FILE=${MNIST_NAME}.ms | |||||
| BENCHMARK_PATH=${BASEPATH} | BENCHMARK_PATH=${BASEPATH} | ||||
| get_version() { | get_version() { | ||||
| @@ -43,7 +45,7 @@ get_version() { | |||||
| } | } | ||||
| download_inference() { | download_inference() { | ||||
| local MINDSPORE_FILE_NAME="mindspore-lite-${VERSION_STR}-inference-linux-x64" | |||||
| MINDSPORE_FILE_NAME="mindspore-lite-${VERSION_STR}-inference-linux-x64" | |||||
| local MINDSPORE_FILE="${MINDSPORE_FILE_NAME}.tar.gz" | local MINDSPORE_FILE="${MINDSPORE_FILE_NAME}.tar.gz" | ||||
| local MINDSPORE_LITE_DOWNLOAD_URL="https://ms-release.obs.cn-north-4.myhuaweicloud.com/${VERSION_STR}/MindSpore/lite/release/linux/${MINDSPORE_FILE}" | local MINDSPORE_LITE_DOWNLOAD_URL="https://ms-release.obs.cn-north-4.myhuaweicloud.com/${VERSION_STR}/MindSpore/lite/release/linux/${MINDSPORE_FILE}" | ||||
| @@ -57,8 +59,6 @@ download_inference() { | |||||
| } | } | ||||
| download_mnist() { | download_mnist() { | ||||
| MNIST_NAME=mnist | |||||
| MNIST_FILE=${MNIST_NAME}.ms | |||||
| local MNIST_DOWNLOAD_URL=https://download.mindspore.cn/model_zoo/official/lite/mnist_lite/${MNIST_FILE} | local MNIST_DOWNLOAD_URL=https://download.mindspore.cn/model_zoo/official/lite/mnist_lite/${MNIST_FILE} | ||||
| if [ ! -e ${BASEPATH}/build/${MNIST_FILE} ]; then | if [ ! -e ${BASEPATH}/build/${MNIST_FILE} ]; then | ||||
| @@ -76,7 +76,7 @@ mkdir -p build | |||||
| get_version | get_version | ||||
| download_inference | download_inference | ||||
| if [ "${GEN}" == "ON" ]; then | |||||
| if [[ "${GEN}" == "ON" ]]; then | |||||
| echo "downloading mnist.ms!" | echo "downloading mnist.ms!" | ||||
| download_mnist | download_mnist | ||||
| echo "generating mnist" | echo "generating mnist" | ||||
| @@ -1,65 +0,0 @@ | |||||
| #!/bin/bash | |||||
| # Copyright 2021 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. | |||||
| # ============================================================================ | |||||
| set -e | |||||
| BASEPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" | |||||
| MINDSPORE_ROOT_DIR=${${BASEPATH}%%/mindspore/lite/micro/example/mnist} | |||||
| echo "current dir is: ${BASEPATH}" | |||||
| VERSION_HEADER=${MINDSPORE_ROOT_DIR}/mindspore/lite/include/version.h | |||||
| INPUT_BIN=${BASEPATH}/mnist_input.bin | |||||
| get_version() { | |||||
| VERSION_MAJOR=$(grep "const int ms_version_major =" ${VERSION_HEADER} | tr -dc "[0-9]") | |||||
| VERSION_MINOR=$(grep "const int ms_version_minor =" ${VERSION_HEADER} | tr -dc "[0-9]") | |||||
| VERSION_REVISION=$(grep "const int ms_version_revision =" ${VERSION_HEADER} | tr -dc "[0-9]") | |||||
| VERSION_STR=${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION} | |||||
| } | |||||
| get_version | |||||
| MINDSPORE_FILE_NAME="mindspore-lite-${VERSION_STR}-inference-linux-x64" | |||||
| MINDSPORE_FILE="${MINDSPORE_FILE_NAME}.tar.gz" | |||||
| MINDSPORE_LITE_DOWNLOAD_URL="https://ms-release.obs.cn-north-4.myhuaweicloud.com/${VERSION_STR}/MindSpore/lite/release/linux/${MINDSPORE_FILE}" | |||||
| MNIST_NAME=mnist | |||||
| MNIST_FILE=${MNIST_NAME}.ms | |||||
| MNIST_DOWNLOAD_URL=https://download.mindspore.cn/model_zoo/official/lite/mnist_lite/${MNIST_FILE} | |||||
| mkdir -p build | |||||
| if [ ! -e ${BASEPATH}/build/${MINDSPORE_FILE} ]; then | |||||
| wget -c -O ${BASEPATH}/build/${MINDSPORE_FILE} --no-check-certificate ${MINDSPORE_LITE_DOWNLOAD_URL} | |||||
| fi | |||||
| if [ ! -e ${BASEPATH}/build/${MNIST_FILE} ]; then | |||||
| wget -c -O ${BASEPATH}/build/${MNIST_FILE} --no-check-certificate ${MNIST_DOWNLOAD_URL} | |||||
| fi | |||||
| tar xzvf ${BASEPATH}/build/${MINDSPORE_FILE} -C ${BASEPATH}/build/ || exit 1 | |||||
| rm ${BASEPATH}/build/${MINDSPORE_FILE} || exit 1 | |||||
| PKG_PATH=${BASEPATH}/build/${MINDSPORE_FILE_NAME} | |||||
| # 1. codegen | |||||
| ${BASEPATH}/build/${MINDSPORE_FILE_NAME}/tools/codegen/codegen --codePath=${BASEPATH}/build --modelPath=${BASEPATH}/build/${MNIST_FILE} | |||||
| # 2. build benchmark | |||||
| mkdir -p ${BASEPATH}/build/benchmark && cd ${BASEPATH}/build/benchmark || exit 1 | |||||
| cmake -DPKG_PATH=${PKG_PATH} ${BASEPATH}/build/${MNIST_NAME} | |||||
| make | |||||
| # 3. run benchmark | |||||
| echo "net file: ${BASEPATH}/src/mnist.bin" | |||||
| ./benchmark ${INPUT_BIN} ${BASEPATH}/src/net.bin | |||||