From 0e5f81a0ff1bde0a52593c4970582575e6777387 Mon Sep 17 00:00:00 2001 From: Bin Li Date: Fri, 6 Jul 2018 15:56:48 +0800 Subject: [PATCH] - return SetThreadAffinity result instead of abort - change android demo min sdk to 19 - fix android demo cp error on MacOS --- mace/benchmark/benchmark_model.cc | 5 ++- mace/core/runtime/cpu/cpu_runtime.cc | 32 +++++++++++++------ mace/core/runtime/cpu/cpu_runtime.h | 4 +-- mace/core/testing/test_benchmark_main.cc | 6 +++- mace/examples/android/app/build.gradle | 2 +- .../com/xiaomi/mace/demo/result/InitData.java | 2 +- mace/examples/android/build.sh | 4 +-- .../examples/android/macelibrary/build.gradle | 2 +- mace/public/mace_runtime.h | 3 +- mace/tools/validation/mace_run.cc | 5 ++- 10 files changed, 44 insertions(+), 21 deletions(-) diff --git a/mace/benchmark/benchmark_model.cc b/mace/benchmark/benchmark_model.cc index 5be6d777..7d2c17f6 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/runtime/cpu/cpu_runtime.cc b/mace/core/runtime/cpu/cpu_runtime.cc index 1a070c8f..ec1ed80e 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 6a305f5a..333729e1 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/testing/test_benchmark_main.cc b/mace/core/testing/test_benchmark_main.cc index 014a2b82..4f68d706 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 b9101ae0..0e4d948e 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 c6548342..ab0f54b5 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 1533e806..c1344c82 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 1ee095f4..2f25f017 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 7f8b0576..f7fbf430 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 cba3a926..c50f7502 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( -- GitLab