From: @zhujingxuan Reviewed-by: @wangchengyuan,@jpc_chenjianping Signed-off-by: @wangchengyuanpull/13840/MERGE
| @@ -39,11 +39,19 @@ typedef struct { | |||
| } NpuDeviceInfo; | |||
| /// \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 { | |||
| CpuDeviceInfo cpu_device_info_; | |||
| GpuDeviceInfo gpu_device_info_; | |||
| NpuDeviceInfo npu_device_info_; | |||
| }; | |||
| #endif // NOT_USE_STL | |||
| /// \brief DeviceContext defined for holding backend's configuration information. | |||
| struct DeviceContext { | |||
| @@ -27,6 +27,7 @@ | |||
| #include <stdlib.h> | |||
| #include <string.h> | |||
| #include <stddef.h> | |||
| #include <new> | |||
| #endif // NOT_USE_STL | |||
| #ifndef MS_API | |||
| @@ -126,22 +127,21 @@ class Vector { | |||
| size_ = size; | |||
| elem_size_ = sizeof(T); | |||
| capacity_ = (size == 0 ? DEFAULT_CAPACITY : size); | |||
| data_ = reinterpret_cast<T *>(malloc(capacity_ * elem_size_)); | |||
| data_ = new (std::nothrow) T[capacity_]; | |||
| if (data_ == nullptr) { | |||
| MS_C_EXCEPTION("malloc data failed"); | |||
| } | |||
| memset(data_, 0, capacity_ * elem_size_); | |||
| } | |||
| Vector(size_t size, const T &value) { | |||
| size_ = size; | |||
| elem_size_ = sizeof(T); | |||
| capacity_ = (size == 0 ? DEFAULT_CAPACITY : size); | |||
| data_ = reinterpret_cast<T *>(malloc(capacity_ * elem_size_)); | |||
| data_ = new (std::nothrow) T[capacity_]; | |||
| if (data_ == nullptr) { | |||
| 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; | |||
| } | |||
| } | |||
| @@ -150,30 +150,32 @@ class Vector { | |||
| size_ = vec.size_; | |||
| elem_size_ = sizeof(T); | |||
| capacity_ = vec.capacity_; | |||
| data_ = reinterpret_cast<T *>(malloc(capacity_ * elem_size_)); | |||
| data_ = new (std::nothrow) T[capacity_]; | |||
| if (data_ == nullptr) { | |||
| 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() { | |||
| if (data_ != nullptr) { | |||
| free(data_); | |||
| delete[] data_; | |||
| } | |||
| } | |||
| void clear() { | |||
| size_ = 0; | |||
| if (data_ != nullptr) { | |||
| free(data_); | |||
| delete[] data_; | |||
| data_ = nullptr; | |||
| } | |||
| } | |||
| void push_back(const T &elem) { | |||
| if (data_ == nullptr) { | |||
| data_ = reinterpret_cast<T *>(malloc(capacity_ * elem_size_)); | |||
| data_ = new (std::nothrow) T[capacity_]; | |||
| if (data_ == nullptr) { | |||
| MS_C_EXCEPTION("malloc data failed"); | |||
| } | |||
| @@ -187,7 +189,7 @@ class Vector { | |||
| void push_back(T &&elem) { | |||
| if (data_ == nullptr) { | |||
| data_ = reinterpret_cast<T *>(malloc(capacity_ * elem_size_)); | |||
| data_ = new (std::nothrow) T[capacity_]; | |||
| if (data_ == nullptr) { | |||
| MS_C_EXCEPTION("malloc data failed"); | |||
| } | |||
| @@ -216,7 +218,9 @@ class Vector { | |||
| if (index == size_ - 1) { | |||
| push_back(elem); | |||
| } 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; | |||
| } | |||
| } else { | |||
| @@ -302,7 +306,9 @@ class Vector { | |||
| if (index == size_ - 1) { | |||
| --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_; | |||
| } else { | |||
| MS_C_EXCEPTION("Input index is out of range!"); | |||
| @@ -314,13 +320,15 @@ class Vector { | |||
| capacity_ *= 2; | |||
| } | |||
| T *tmp = data_; | |||
| data_ = reinterpret_cast<T *>(malloc(capacity_ * elem_size_)); | |||
| data_ = new (std::nothrow) T[capacity_]; | |||
| if (data_ == nullptr) { | |||
| 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; | |||
| free(tmp); | |||
| delete[] tmp; | |||
| } | |||
| void reserve(size_t capacity) { | |||
| @@ -336,11 +344,13 @@ class Vector { | |||
| size_ = vec.size_; | |||
| elem_size_ = sizeof(T); | |||
| capacity_ = vec.capacity_; | |||
| data_ = reinterpret_cast<T *>(malloc(capacity_ * elem_size_)); | |||
| data_ = new (std::nothrow) T[capacity_]; | |||
| if (data_ == nullptr) { | |||
| 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; | |||
| } | |||
| @@ -27,11 +27,13 @@ do | |||
| done | |||
| 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}" | |||
| INPUT_BIN=${BASEPATH}/mnist_input.bin | |||
| MNIST_NAME=mnist | |||
| MNIST_FILE=${MNIST_NAME}.ms | |||
| BENCHMARK_PATH=${BASEPATH} | |||
| get_version() { | |||
| @@ -43,7 +45,7 @@ get_version() { | |||
| } | |||
| 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_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() { | |||
| MNIST_NAME=mnist | |||
| MNIST_FILE=${MNIST_NAME}.ms | |||
| local MNIST_DOWNLOAD_URL=https://download.mindspore.cn/model_zoo/official/lite/mnist_lite/${MNIST_FILE} | |||
| if [ ! -e ${BASEPATH}/build/${MNIST_FILE} ]; then | |||
| @@ -76,7 +76,7 @@ mkdir -p build | |||
| get_version | |||
| download_inference | |||
| if [ "${GEN}" == "ON" ]; then | |||
| if [[ "${GEN}" == "ON" ]]; then | |||
| echo "downloading mnist.ms!" | |||
| download_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 | |||