Files
2026-07-13 13:33:03 +08:00

79 lines
2.6 KiB
C++

//
// 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<std::function<void(int)>, 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 <dispatch/dispatch.h>
#include <stddef.h>
#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 <omp.h>
#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 <omp.h>
#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 */