// // Concurrency.h // MNN // // Created by MNN on 2018/07/26. // Copyright © 2018, Alibaba Group Holding Limited // #ifndef concurrency_h #define concurrency_h #define LAUNCH_MULTI_THREADS_WORKLOAD 1e+5 #ifdef MNN_FORBIT_MULTI_THREADS #define MNN_CONCURRENCY_ENQUEUE(task) \ for (int __iter__ = 0; __iter__ < task.second; __iter__++) {task.first(__iter__);} #define MNN_CONCURRENCY_BEGIN(__iter__, __num__) for (int __iter__ = 0; __iter__ < __num__; __iter__++) { #define MNN_CONCURRENCY_END() } #elif defined(MNN_USE_THREAD_POOL) #include "backend/cpu/ThreadPool.hpp" #define MNN_STRINGIFY(a) #a #define MNN_CONCURRENCY_ENQUEUE(task) ((CPUBackend*)backend())->enqueue(task) #define MNN_CONCURRENCY_BEGIN(__iter__, __num__) \ { \ std::pair, int> task; \ task.second = __num__; \ task.first = [&](int __iter__) { #define MNN_CONCURRENCY_END() \ } \ ; \ auto cpuBn = (CPUBackend*)backend(); \ cpuBn->enqueue(task); \ } #else // iOS / OSX #if defined(__APPLE__) #include #include #define MNN_CONCURRENCY_ENQUEUE(task) \ dispatch_apply(task.second, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t __iter__) {task.first(__iter__);}); #define MNN_CONCURRENCY_BEGIN(__iter__, __num__) \ dispatch_apply(__num__, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t __iter__) { #define MNN_CONCURRENCY_END() \ (void)(backend()); \ }); // Windows #elif defined(_MSC_VER) #include #define MNN_CONCURRENCY_BEGIN(__iter__, __num__) \ __pragma(omp parallel for) for (int __iter__ = 0; __iter__ < __num__; __iter__++) { #define MNN_CONCURRENCY_END() } #define MNN_CONCURRENCY_BEGIN_CONDITION(__iter__, __num__, __condition__) \ int __iter__ = 0; \ __pragma(omp parallel for if(__condition__)) \ for (; __iter__ < __num__; __iter__++) { // Android #else #include #define MNN_CONCURRENCY_ENQUEUE(task) \ _Pragma("omp parallel for") for (int __iter__ = 0; __iter__ < task.second; __iter__++) {task.first(__iter__);} #define MNN_STRINGIFY(a) #a #define MNN_CONCURRENCY_BEGIN(__iter__, __num__) \ _Pragma("omp parallel for") for (int __iter__ = 0; __iter__ < __num__; __iter__++) { #define MNN_CONCURRENCY_END() } #endif #endif #endif /* concurrency_h */