diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fe0fd433b61fdcb48acd4aa2e733f137d7919fe2..c9545fd88f94342e10c9db9f6814eceddb528d0d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -99,7 +99,7 @@ python_tools_tests: script: - pwd - rm -rf mace-models - - GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone git@v9.git.n.xiaomi.com:deep-computing/mace-models.git + - GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone git@github.com:XiaoMi/mace-models.git - CONF_FILE=mace-models/mobilenet-v2/mobilenet-v2.yml - sh -c "python tools/converter.py build --config=${CONF_FILE} --disable_tuning && python tools/converter.py run --config=${CONF_FILE} --round=1 --validate && python tools/converter.py run --config=${CONF_FILE} --example --round=1 --validate" || exit 1 - rm -rf mace-models diff --git a/mace/benchmark/benchmark_model.cc b/mace/benchmark/benchmark_model.cc index 5be6d77778963531ecebc0b0cb6aad1963732846..7d2c17f6b7b7fba760369dad4514cce038f1b105 100644 --- a/mace/benchmark/benchmark_model.cc +++ b/mace/benchmark/benchmark_model.cc @@ -253,9 +253,12 @@ int Main(int argc, char **argv) { mace::DeviceType device_type = ParseDeviceType(FLAGS_device); // config runtime - mace::SetOpenMPThreadPolicy( + MaceStatus ret = mace::SetOpenMPThreadPolicy( FLAGS_omp_num_threads, static_cast(FLAGS_cpu_affinity_policy)); + if (ret != MACE_SUCCESS) { + LOG(WARNING) << "Set openmp or cpu affinity failed."; + } #ifdef MACE_ENABLE_OPENCL if (device_type == DeviceType::GPU) { mace::SetGPUHints( diff --git a/mace/core/mace.cc b/mace/core/mace.cc index 2150e83afcdbf05795360bfef7e55cbe4b38b08a..db04fcc699c481f0e06c385a7b7cc8325a463aa7 100644 --- a/mace/core/mace.cc +++ b/mace/core/mace.cc @@ -204,9 +204,6 @@ MaceStatus MaceEngine::Impl::Init( MACE_CHECK(hexagon_controller_->Init(), "hexagon init error"); hexagon_controller_->SetDebugLevel( static_cast(mace::logging::LogMessage::MinVLogLevel())); - int dsp_mode = - ProtoArgHelper::GetOptionalArg(*net_def, "dsp_mode", 0); - hexagon_controller_->SetGraphMode(dsp_mode); MACE_CHECK(hexagon_controller_->SetupGraph(*net_def, model_data), "hexagon setup graph error"); if (VLOG_IS_ON(2)) { diff --git a/mace/core/runtime/cpu/cpu_runtime.cc b/mace/core/runtime/cpu/cpu_runtime.cc index 1a070c8fb1bce26343ec2c202d782803b0e2ad64..ec1ed80eed340f63ac30d053c2becb3418c43e25 100644 --- a/mace/core/runtime/cpu/cpu_runtime.cc +++ b/mace/core/runtime/cpu/cpu_runtime.cc @@ -77,14 +77,19 @@ int GetCPUMaxFreq(int cpu_id) { return freq; } -void SetThreadAffinity(cpu_set_t mask) { +MaceStatus SetThreadAffinity(cpu_set_t mask) { #if defined(__ANDROID__) pid_t pid = gettid(); #else pid_t pid = syscall(SYS_gettid); #endif int err = sched_setaffinity(pid, sizeof(mask), &mask); - MACE_CHECK(err == 0, "set affinity error: ", strerror(errno)); + if (err) { + LOG(WARNING) << "set affinity error: " << strerror(errno); + return MACE_INVALID_ARGS; + } else { + return MACE_SUCCESS; + } } } // namespace @@ -129,8 +134,8 @@ MaceStatus GetCPUBigLittleCoreIDs(std::vector *big_core_ids, return MACE_SUCCESS; } -void SetOpenMPThreadsAndAffinityCPUs(int omp_num_threads, - const std::vector &cpu_ids) { +MaceStatus SetOpenMPThreadsAndAffinityCPUs(int omp_num_threads, + const std::vector &cpu_ids) { #ifdef MACE_ENABLE_OPENMP VLOG(1) << "Set OpenMP threads number: " << omp_num_threads << ", CPU core IDs: " << MakeString(cpu_ids); @@ -146,17 +151,23 @@ void SetOpenMPThreadsAndAffinityCPUs(int omp_num_threads, for (auto cpu_id : cpu_ids) { CPU_SET(cpu_id, &mask); } - #ifdef MACE_ENABLE_OPENMP + std::vector status(omp_num_threads); #pragma omp parallel for for (int i = 0; i < omp_num_threads; ++i) { VLOG(1) << "Set affinity for OpenMP thread " << omp_get_thread_num() << "/" << omp_get_num_threads(); - SetThreadAffinity(mask); + status[i] = SetThreadAffinity(mask); + } + for (int i = 0; i < omp_num_threads; ++i) { + if (status[i] != MACE_SUCCESS) + return MACE_INVALID_ARGS; } + return MACE_SUCCESS; #else - SetThreadAffinity(mask); + MaceStatus status = SetThreadAffinity(mask); VLOG(1) << "Set affinity without OpenMP: " << mask.__bits[0]; + return status; #endif } @@ -191,8 +202,8 @@ MaceStatus SetOpenMPThreadsAndAffinityPolicy(int omp_num_threads_hint, omp_num_threads_hint > static_cast(use_cpu_ids.size())) { omp_num_threads_hint = use_cpu_ids.size(); } - SetOpenMPThreadsAndAffinityCPUs(omp_num_threads_hint, use_cpu_ids); - return MACE_SUCCESS; + + return SetOpenMPThreadsAndAffinityCPUs(omp_num_threads_hint, use_cpu_ids); } MaceStatus SetOpenMPThreadPolicy(int num_threads_hint, @@ -202,7 +213,8 @@ MaceStatus SetOpenMPThreadPolicy(int num_threads_hint, return SetOpenMPThreadsAndAffinityPolicy(num_threads_hint, policy); } -void SetOpenMPThreadAffinity(int num_threads, const std::vector &cpu_ids) { +MaceStatus SetOpenMPThreadAffinity(int num_threads, + const std::vector &cpu_ids) { return SetOpenMPThreadsAndAffinityCPUs(num_threads, cpu_ids); } diff --git a/mace/core/runtime/cpu/cpu_runtime.h b/mace/core/runtime/cpu/cpu_runtime.h index 6a305f5aaee9ea1d3f459ccf330d49bc0aa4ca78..333729e19491449d5d519a4ce78eae1ab3d4cef1 100644 --- a/mace/core/runtime/cpu/cpu_runtime.h +++ b/mace/core/runtime/cpu/cpu_runtime.h @@ -25,8 +25,8 @@ namespace mace { MaceStatus GetCPUBigLittleCoreIDs(std::vector *big_core_ids, std::vector *little_core_ids); -void SetOpenMPThreadsAndAffinityCPUs(int omp_num_threads, - const std::vector &cpu_ids); +MaceStatus SetOpenMPThreadsAndAffinityCPUs(int omp_num_threads, + const std::vector &cpu_ids); MaceStatus SetOpenMPThreadsAndAffinityPolicy(int omp_num_threads_hint, CPUAffinityPolicy policy); diff --git a/mace/core/runtime/hexagon/hexagon_control_wrapper.cc b/mace/core/runtime/hexagon/hexagon_control_wrapper.cc index 0dac0c327692fbc998c2e6f03bd930f0a93f7b09..62312744845055bc05370dc51bb6e8e7ed33c812 100644 --- a/mace/core/runtime/hexagon/hexagon_control_wrapper.cc +++ b/mace/core/runtime/hexagon/hexagon_control_wrapper.cc @@ -51,7 +51,7 @@ int HexagonControlWrapper::GetVersion() { bool HexagonControlWrapper::Config() { LOG(INFO) << "Hexagon config"; - if (hexagon_controller_InitHexagonWithMaxAttributes(0, 100) != 0) { + if (hexagon_nn_set_powersave_level(0) != 0) { return false; } return hexagon_nn_config() == 0; @@ -66,7 +66,7 @@ bool HexagonControlWrapper::Init() { bool HexagonControlWrapper::Finalize() { LOG(INFO) << "Hexagon finalize"; - return hexagon_controller_DeInitHexagon() == 0; + return hexagon_nn_set_powersave_level(1) == 0; } bool HexagonControlWrapper::SetupGraph(const NetDef &net_def, @@ -271,11 +271,6 @@ void HexagonControlWrapper::SetDebugLevel(int level) { "set debug level error"); } -void HexagonControlWrapper::SetGraphMode(int mode) { - LOG(INFO) << "Set dsp mode: " << mode; - MACE_CHECK(hexagon_nn_set_graph_mode(nn_id_, mode) == 0, "set mode error"); -} - void HexagonControlWrapper::GetPerfInfo() { LOG(INFO) << "Get perf info"; std::vector perf_info(MACE_MAX_NODE); diff --git a/mace/core/runtime/hexagon/hexagon_control_wrapper.h b/mace/core/runtime/hexagon/hexagon_control_wrapper.h index 4e4d8499e45c1b174caa06c8e3c2be679affd288..adcd5224e447ae565a1286246ae84e1be23d08f8 100644 --- a/mace/core/runtime/hexagon/hexagon_control_wrapper.h +++ b/mace/core/runtime/hexagon/hexagon_control_wrapper.h @@ -17,10 +17,10 @@ #include -#include "mace/core/runtime/hexagon/hexagon_controller.h" #include "mace/core/runtime/hexagon/quantize.h" #include "mace/core/tensor.h" #include "mace/public/mace.h" +#include "third_party/nnlib/hexagon_nn.h" namespace mace { @@ -44,7 +44,6 @@ class HexagonControlWrapper { void GetPerfInfo(); void ResetPerfInfo(); void SetDebugLevel(int level); - void SetGraphMode(int mode); private: static constexpr int NODE_ID_OFFSET = 10000; diff --git a/mace/core/runtime/hexagon/hexagon_controller.h b/mace/core/runtime/hexagon/hexagon_controller.h deleted file mode 100644 index afe4b727de4936aedee3c9515963d013050e48eb..0000000000000000000000000000000000000000 --- a/mace/core/runtime/hexagon/hexagon_controller.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2018 Xiaomi, Inc. All rights reserved. -// -// 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 MACE_CORE_RUNTIME_HEXAGON_HEXAGON_CONTROLLER_H_ -#define MACE_CORE_RUNTIME_HEXAGON_HEXAGON_CONTROLLER_H_ - -#include "third_party/nnlib/hexagon_nn.h" - -#ifdef __cplusplus -extern "C" { -#else -#include -#endif // __cplusplus - -int hexagon_controller_InitHexagonWithMaxAttributes(int enable_dcvs, - int bus_usage); - -int hexagon_controller_DeInitHexagon(); - -#ifdef __cplusplus -} -#endif // __cplusplus - -#endif // MACE_CORE_RUNTIME_HEXAGON_HEXAGON_CONTROLLER_H_ - diff --git a/mace/core/testing/test_benchmark_main.cc b/mace/core/testing/test_benchmark_main.cc index 014a2b826806ec29fccc0e527e4f83975dbfc8b5..4f68d7063af63a2bfd0c124d347a4c527b84dd44 100644 --- a/mace/core/testing/test_benchmark_main.cc +++ b/mace/core/testing/test_benchmark_main.cc @@ -18,6 +18,7 @@ #include "mace/core/testing/test_benchmark.h" #include "mace/public/mace.h" #include "mace/public/mace_runtime.h" +#include "mace/utils/logging.h" DEFINE_string(filter, "all", "op benchmark regex filter, eg:.*CONV.*"); DEFINE_int32(gpu_perf_hint, 3, "0:DEFAULT/1:LOW/2:NORMAL/3:HIGH"); @@ -33,9 +34,12 @@ int main(int argc, char **argv) { gflags::ParseCommandLineFlags(&argc, &argv, true); // config runtime - mace::SetOpenMPThreadPolicy( + mace::MaceStatus status = mace::SetOpenMPThreadPolicy( FLAGS_omp_num_threads, static_cast(FLAGS_cpu_affinity_policy)); + if (status != mace::MACE_SUCCESS) { + LOG(WARNING) << "Set openmp or cpu affinity failed."; + } mace::SetGPUHints( static_cast(FLAGS_gpu_perf_hint), static_cast(FLAGS_gpu_priority_hint)); diff --git a/mace/examples/android/app/build.gradle b/mace/examples/android/app/build.gradle index b9101ae015408ba68c81700254a728c98f1f5ced..0e4d948e80ac3a865536028274dcd900d095871a 100644 --- a/mace/examples/android/app/build.gradle +++ b/mace/examples/android/app/build.gradle @@ -4,7 +4,7 @@ android { compileSdkVersion 26 defaultConfig { applicationId "com.xiaomi.mace.demo" - minSdkVersion 23 + minSdkVersion 19 targetSdkVersion 26 versionCode 1 versionName "1.0" diff --git a/mace/examples/android/app/src/main/java/com/xiaomi/mace/demo/result/InitData.java b/mace/examples/android/app/src/main/java/com/xiaomi/mace/demo/result/InitData.java index c65483426ef7159d01462d7f39a24488d9351aaa..ab0f54b587bc9bbcd574c12b6f449172cade1689 100644 --- a/mace/examples/android/app/src/main/java/com/xiaomi/mace/demo/result/InitData.java +++ b/mace/examples/android/app/src/main/java/com/xiaomi/mace/demo/result/InitData.java @@ -34,7 +34,7 @@ public class InitData { public InitData() { model = MODELS[0]; ompNumThreads = 2; - cpuAffinityPolicy = 1; + cpuAffinityPolicy = 0; gpuPerfHint = 3; gpuPriorityHint = 3; device = DEVICES[0]; diff --git a/mace/examples/android/build.sh b/mace/examples/android/build.sh index 1533e80695299f140fb769af93aae5f3ea2fcc06..c1344c82872333931700fefdaa96837ec6e09c1c 100755 --- a/mace/examples/android/build.sh +++ b/mace/examples/android/build.sh @@ -5,8 +5,8 @@ set -e -u -o pipefail pushd ../../../ python tools/converter.py build --config=docs/getting_started/models/demo_app_models.yaml -cp -r builds/mobilenet/include/ mace/examples/android/macelibrary/src/main/cpp/ -cp -r builds/mobilenet/lib/ mace/examples/android/macelibrary/src/main/cpp/ +cp -r builds/mobilenet/include mace/examples/android/macelibrary/src/main/cpp/ +cp -r builds/mobilenet/lib mace/examples/android/macelibrary/src/main/cpp/ popd diff --git a/mace/examples/android/macelibrary/build.gradle b/mace/examples/android/macelibrary/build.gradle index 1ee095f45af487c85b25c378700095ed7182d173..2f25f01728428faf03a648f72b7b70ddec3b2824 100644 --- a/mace/examples/android/macelibrary/build.gradle +++ b/mace/examples/android/macelibrary/build.gradle @@ -9,7 +9,7 @@ android { } defaultConfig { - minSdkVersion 23 + minSdkVersion 19 targetSdkVersion 26 versionCode 1 versionName "1.0" diff --git a/mace/public/mace_runtime.h b/mace/public/mace_runtime.h index 7f8b0576b462d1b4c992e87c091cbfe2c0ed9300..f7fbf430dddbce6747fd3b953c9778d655c523c0 100644 --- a/mace/public/mace_runtime.h +++ b/mace/public/mace_runtime.h @@ -125,7 +125,8 @@ MaceStatus SetOpenMPThreadPolicy(int num_threads_hint, // affinity to offline cores may run very slow or unexpectedly. In such cases, // please use SetOpenMPThreadPolicy with default policy instead. __attribute__((visibility("default"))) -void SetOpenMPThreadAffinity(int num_threads, const std::vector &cpu_ids); +MaceStatus SetOpenMPThreadAffinity(int num_threads, + const std::vector &cpu_ids); // Get ARM big.LITTLE configuration. // diff --git a/mace/tools/validation/mace_run.cc b/mace/tools/validation/mace_run.cc index cba3a926622d8f0867ff1e54ac0425f9752e456f..c50f7502c4abacd77cca8e32898df14f63d48fae 100644 --- a/mace/tools/validation/mace_run.cc +++ b/mace/tools/validation/mace_run.cc @@ -198,9 +198,12 @@ bool RunModel(const std::string &model_name, const std::vector> &output_shapes) { DeviceType device_type = ParseDeviceType(FLAGS_device); // config runtime - mace::SetOpenMPThreadPolicy( + MaceStatus status = mace::SetOpenMPThreadPolicy( FLAGS_omp_num_threads, static_cast(FLAGS_cpu_affinity_policy)); + if (status != MACE_SUCCESS) { + LOG(WARNING) << "Set openmp or cpu affinity failed."; + } #ifdef MACE_ENABLE_OPENCL if (device_type == DeviceType::GPU) { mace::SetGPUHints( diff --git a/third_party/nnlib/hexagon_nn.h b/third_party/nnlib/hexagon_nn.h index b8dbad353a059c2e55c10785b33c97880ca1dadb..b7485c93f4db702b60091b66ac2a9af9b2438719 100644 --- a/third_party/nnlib/hexagon_nn.h +++ b/third_party/nnlib/hexagon_nn.h @@ -37,7 +37,7 @@ #define THIRD_PARTY_NNLIB_HEXAGON_NN_H_ #ifndef __QAIC_HEADER #define __QAIC_HEADER(ff) ff -#endif // __QAIC_HEADER +#endif //__QAIC_HEADER #ifndef __QAIC_HEADER_EXPORT #define __QAIC_HEADER_EXPORT @@ -49,7 +49,7 @@ #ifndef __QAIC_IMPL #define __QAIC_IMPL(ff) ff -#endif // __QAIC_IMPL +#endif //__QAIC_IMPL #ifndef __QAIC_IMPL_EXPORT #define __QAIC_IMPL_EXPORT @@ -131,7 +131,7 @@ struct hexagon_nn_const_node { }; __QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_config)(void) __QAIC_HEADER_ATTRIBUTE; -__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_init)(hexagon_nn_nn_id* g) +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_init)(hexagon_nn_nn_id *g) __QAIC_HEADER_ATTRIBUTE; __QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_set_debug_level)( hexagon_nn_nn_id id, int level) __QAIC_HEADER_ATTRIBUTE; @@ -221,6 +221,8 @@ __QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_execute_new)( int inputsLen, hexagon_nn_tensordef *outputs, int outputsLen) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT unsigned int __QAIC_HEADER(hexagon_nn_get_dsp_offset)(void) + __QAIC_HEADER_ATTRIBUTE; #ifdef __cplusplus } #endif diff --git a/third_party/nnlib/libhexagon_controller.so b/third_party/nnlib/libhexagon_controller.so index 7daedd621b12686032f952a0da6564a13b63981a..05c8f3d8d71401ff117ce9b75f21cebc5e44dc66 100755 Binary files a/third_party/nnlib/libhexagon_controller.so and b/third_party/nnlib/libhexagon_controller.so differ