xref: /aosp_15_r20/external/pytorch/caffe2/utils/threadpool/pthreadpool.h (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker // pthreadpool header from https://github.com/Maratyszcza/pthreadpool
2*da0073e9SAndroid Build Coastguard Worker // for NNPACK
3*da0073e9SAndroid Build Coastguard Worker #ifndef CAFFE2_UTILS_PTHREADPOOL_H_
4*da0073e9SAndroid Build Coastguard Worker #define CAFFE2_UTILS_PTHREADPOOL_H_
5*da0073e9SAndroid Build Coastguard Worker 
6*da0073e9SAndroid Build Coastguard Worker #include "ThreadPoolCommon.h"
7*da0073e9SAndroid Build Coastguard Worker 
8*da0073e9SAndroid Build Coastguard Worker #include <stddef.h> // for size_t
9*da0073e9SAndroid Build Coastguard Worker #include <stdint.h> // for uint32_t
10*da0073e9SAndroid Build Coastguard Worker 
11*da0073e9SAndroid Build Coastguard Worker #if defined(USE_PTHREADPOOL)
12*da0073e9SAndroid Build Coastguard Worker // This is a hack.
13*da0073e9SAndroid Build Coastguard Worker // Mainly introduced here because
14*da0073e9SAndroid Build Coastguard Worker // 1. NNPACK can be compiled to use internal legacy threadpool implementation because much of C2 depends on that.
15*da0073e9SAndroid Build Coastguard Worker // 2. Then if we want to use NNPACK in PyTorch, which uses new pthreadpool, then we will supply new pthreadpool pointer
16*da0073e9SAndroid Build Coastguard Worker //    to NNPACK. This will not work if NNPACK is compiled with internal legacy threadpool. Thus this guard
17*da0073e9SAndroid Build Coastguard Worker //    along with changes in pthreadpool_impl.cc allows us to override that behavior.
18*da0073e9SAndroid Build Coastguard Worker //    It enables us to use NNPACK from pytorch using `caffe2::pthreadpool_()`
19*da0073e9SAndroid Build Coastguard Worker namespace caffe2 {
20*da0073e9SAndroid Build Coastguard Worker class WithCastToNewThreadPool {
21*da0073e9SAndroid Build Coastguard Worker   public:
22*da0073e9SAndroid Build Coastguard Worker     explicit WithCastToNewThreadPool(bool use_new_threadpool);
23*da0073e9SAndroid Build Coastguard Worker     ~WithCastToNewThreadPool();
24*da0073e9SAndroid Build Coastguard Worker   private:
25*da0073e9SAndroid Build Coastguard Worker     bool use_new_threadpool_;
26*da0073e9SAndroid Build Coastguard Worker };
27*da0073e9SAndroid Build Coastguard Worker }
28*da0073e9SAndroid Build Coastguard Worker #endif
29*da0073e9SAndroid Build Coastguard Worker 
30*da0073e9SAndroid Build Coastguard Worker typedef struct pthreadpool* legacy_pthreadpool_t;
31*da0073e9SAndroid Build Coastguard Worker 
32*da0073e9SAndroid Build Coastguard Worker typedef void (*legacy_pthreadpool_function_1d_t)(void*, size_t);
33*da0073e9SAndroid Build Coastguard Worker typedef void (*legacy_pthreadpool_function_1d_tiled_t)(void*, size_t, size_t);
34*da0073e9SAndroid Build Coastguard Worker typedef void (*legacy_pthreadpool_function_2d_t)(void*, size_t, size_t);
35*da0073e9SAndroid Build Coastguard Worker typedef void (*legacy_pthreadpool_function_2d_tiled_t)(void*, size_t, size_t, size_t, size_t);
36*da0073e9SAndroid Build Coastguard Worker typedef void (*legacy_pthreadpool_function_3d_tiled_t)(
37*da0073e9SAndroid Build Coastguard Worker     void*,
38*da0073e9SAndroid Build Coastguard Worker     size_t,
39*da0073e9SAndroid Build Coastguard Worker     size_t,
40*da0073e9SAndroid Build Coastguard Worker     size_t,
41*da0073e9SAndroid Build Coastguard Worker     size_t,
42*da0073e9SAndroid Build Coastguard Worker     size_t,
43*da0073e9SAndroid Build Coastguard Worker     size_t);
44*da0073e9SAndroid Build Coastguard Worker typedef void (*legacy_pthreadpool_function_4d_tiled_t)(
45*da0073e9SAndroid Build Coastguard Worker     void*,
46*da0073e9SAndroid Build Coastguard Worker     size_t,
47*da0073e9SAndroid Build Coastguard Worker     size_t,
48*da0073e9SAndroid Build Coastguard Worker     size_t,
49*da0073e9SAndroid Build Coastguard Worker     size_t,
50*da0073e9SAndroid Build Coastguard Worker     size_t,
51*da0073e9SAndroid Build Coastguard Worker     size_t,
52*da0073e9SAndroid Build Coastguard Worker     size_t,
53*da0073e9SAndroid Build Coastguard Worker     size_t);
54*da0073e9SAndroid Build Coastguard Worker 
55*da0073e9SAndroid Build Coastguard Worker #ifdef __cplusplus
56*da0073e9SAndroid Build Coastguard Worker extern "C" {
57*da0073e9SAndroid Build Coastguard Worker #endif
58*da0073e9SAndroid Build Coastguard Worker 
59*da0073e9SAndroid Build Coastguard Worker /**
60*da0073e9SAndroid Build Coastguard Worker  * Creates a thread pool with the specified number of threads.
61*da0073e9SAndroid Build Coastguard Worker  *
62*da0073e9SAndroid Build Coastguard Worker  * @param[in]  threads_count  The number of threads in the thread pool.
63*da0073e9SAndroid Build Coastguard Worker  *    A value of 0 has special interpretation: it creates a thread for each
64*da0073e9SAndroid Build Coastguard Worker  *    processor core available in the system.
65*da0073e9SAndroid Build Coastguard Worker  *
66*da0073e9SAndroid Build Coastguard Worker  * @returns  A pointer to an opaque thread pool object.
67*da0073e9SAndroid Build Coastguard Worker  *    On error the function returns NULL and sets errno accordingly.
68*da0073e9SAndroid Build Coastguard Worker  */
69*da0073e9SAndroid Build Coastguard Worker 
70*da0073e9SAndroid Build Coastguard Worker // Returns internal threadpool impl.
71*da0073e9SAndroid Build Coastguard Worker legacy_pthreadpool_t legacy_pthreadpool_create(size_t threads_count);
72*da0073e9SAndroid Build Coastguard Worker 
73*da0073e9SAndroid Build Coastguard Worker /**
74*da0073e9SAndroid Build Coastguard Worker  * Queries the number of threads in a thread pool.
75*da0073e9SAndroid Build Coastguard Worker  *
76*da0073e9SAndroid Build Coastguard Worker  * @param[in]  threadpool  The thread pool to query.
77*da0073e9SAndroid Build Coastguard Worker  *
78*da0073e9SAndroid Build Coastguard Worker  * @returns  The number of threads in the thread pool.
79*da0073e9SAndroid Build Coastguard Worker  */
80*da0073e9SAndroid Build Coastguard Worker size_t legacy_pthreadpool_get_threads_count(legacy_pthreadpool_t threadpool);
81*da0073e9SAndroid Build Coastguard Worker 
82*da0073e9SAndroid Build Coastguard Worker /**
83*da0073e9SAndroid Build Coastguard Worker  * Processes items in parallel using threads from a thread pool.
84*da0073e9SAndroid Build Coastguard Worker  *
85*da0073e9SAndroid Build Coastguard Worker  * When the call returns, all items have been processed and the thread pool is
86*da0073e9SAndroid Build Coastguard Worker  * ready for a new task.
87*da0073e9SAndroid Build Coastguard Worker  *
88*da0073e9SAndroid Build Coastguard Worker  * @note If multiple threads call this function with the same thread pool, the
89*da0073e9SAndroid Build Coastguard Worker  *    calls are serialized.
90*da0073e9SAndroid Build Coastguard Worker  *
91*da0073e9SAndroid Build Coastguard Worker  * @param[in]  threadpool  The thread pool to use for parallelisation.
92*da0073e9SAndroid Build Coastguard Worker  * @param[in]  function    The function to call for each item.
93*da0073e9SAndroid Build Coastguard Worker  * @param[in]  argument    The first argument passed to the @a function.
94*da0073e9SAndroid Build Coastguard Worker  * @param[in]  items       The number of items to process. The @a function
95*da0073e9SAndroid Build Coastguard Worker  *    will be called once for each item.
96*da0073e9SAndroid Build Coastguard Worker  */
97*da0073e9SAndroid Build Coastguard Worker void legacy_pthreadpool_compute_1d(
98*da0073e9SAndroid Build Coastguard Worker     legacy_pthreadpool_t threadpool,
99*da0073e9SAndroid Build Coastguard Worker     legacy_pthreadpool_function_1d_t function,
100*da0073e9SAndroid Build Coastguard Worker     void* argument,
101*da0073e9SAndroid Build Coastguard Worker     size_t range);
102*da0073e9SAndroid Build Coastguard Worker 
103*da0073e9SAndroid Build Coastguard Worker void legacy_pthreadpool_parallelize_1d(
104*da0073e9SAndroid Build Coastguard Worker     legacy_pthreadpool_t threadpool,
105*da0073e9SAndroid Build Coastguard Worker     legacy_pthreadpool_function_1d_t function,
106*da0073e9SAndroid Build Coastguard Worker     void* argument,
107*da0073e9SAndroid Build Coastguard Worker     size_t range,
108*da0073e9SAndroid Build Coastguard Worker     uint32_t flags);
109*da0073e9SAndroid Build Coastguard Worker 
110*da0073e9SAndroid Build Coastguard Worker void legacy_pthreadpool_compute_1d_tiled(
111*da0073e9SAndroid Build Coastguard Worker     legacy_pthreadpool_t threadpool,
112*da0073e9SAndroid Build Coastguard Worker     legacy_pthreadpool_function_1d_tiled_t function,
113*da0073e9SAndroid Build Coastguard Worker     void* argument,
114*da0073e9SAndroid Build Coastguard Worker     size_t range,
115*da0073e9SAndroid Build Coastguard Worker     size_t tile);
116*da0073e9SAndroid Build Coastguard Worker 
117*da0073e9SAndroid Build Coastguard Worker void legacy_pthreadpool_compute_2d(
118*da0073e9SAndroid Build Coastguard Worker     legacy_pthreadpool_t threadpool,
119*da0073e9SAndroid Build Coastguard Worker     legacy_pthreadpool_function_2d_t function,
120*da0073e9SAndroid Build Coastguard Worker     void* argument,
121*da0073e9SAndroid Build Coastguard Worker     size_t range_i,
122*da0073e9SAndroid Build Coastguard Worker     size_t range_j);
123*da0073e9SAndroid Build Coastguard Worker 
124*da0073e9SAndroid Build Coastguard Worker void legacy_pthreadpool_compute_2d_tiled(
125*da0073e9SAndroid Build Coastguard Worker     legacy_pthreadpool_t threadpool,
126*da0073e9SAndroid Build Coastguard Worker     legacy_pthreadpool_function_2d_tiled_t function,
127*da0073e9SAndroid Build Coastguard Worker     void* argument,
128*da0073e9SAndroid Build Coastguard Worker     size_t range_i,
129*da0073e9SAndroid Build Coastguard Worker     size_t range_j,
130*da0073e9SAndroid Build Coastguard Worker     size_t tile_i,
131*da0073e9SAndroid Build Coastguard Worker     size_t tile_j);
132*da0073e9SAndroid Build Coastguard Worker 
133*da0073e9SAndroid Build Coastguard Worker void legacy_pthreadpool_compute_3d_tiled(
134*da0073e9SAndroid Build Coastguard Worker     legacy_pthreadpool_t threadpool,
135*da0073e9SAndroid Build Coastguard Worker     legacy_pthreadpool_function_3d_tiled_t function,
136*da0073e9SAndroid Build Coastguard Worker     void* argument,
137*da0073e9SAndroid Build Coastguard Worker     size_t range_i,
138*da0073e9SAndroid Build Coastguard Worker     size_t range_j,
139*da0073e9SAndroid Build Coastguard Worker     size_t range_k,
140*da0073e9SAndroid Build Coastguard Worker     size_t tile_i,
141*da0073e9SAndroid Build Coastguard Worker     size_t tile_j,
142*da0073e9SAndroid Build Coastguard Worker     size_t tile_k);
143*da0073e9SAndroid Build Coastguard Worker 
144*da0073e9SAndroid Build Coastguard Worker void legacy_pthreadpool_compute_4d_tiled(
145*da0073e9SAndroid Build Coastguard Worker     legacy_pthreadpool_t threadpool,
146*da0073e9SAndroid Build Coastguard Worker     legacy_pthreadpool_function_4d_tiled_t function,
147*da0073e9SAndroid Build Coastguard Worker     void* argument,
148*da0073e9SAndroid Build Coastguard Worker     size_t range_i,
149*da0073e9SAndroid Build Coastguard Worker     size_t range_j,
150*da0073e9SAndroid Build Coastguard Worker     size_t range_k,
151*da0073e9SAndroid Build Coastguard Worker     size_t range_l,
152*da0073e9SAndroid Build Coastguard Worker     size_t tile_i,
153*da0073e9SAndroid Build Coastguard Worker     size_t tile_j,
154*da0073e9SAndroid Build Coastguard Worker     size_t tile_k,
155*da0073e9SAndroid Build Coastguard Worker     size_t tile_l);
156*da0073e9SAndroid Build Coastguard Worker 
157*da0073e9SAndroid Build Coastguard Worker /**
158*da0073e9SAndroid Build Coastguard Worker  * Terminates threads in the thread pool and releases associated resources.
159*da0073e9SAndroid Build Coastguard Worker  *
160*da0073e9SAndroid Build Coastguard Worker  * @warning  Accessing the thread pool after a call to this function constitutes
161*da0073e9SAndroid Build Coastguard Worker  *    undefined behaviour and may cause data corruption.
162*da0073e9SAndroid Build Coastguard Worker  *
163*da0073e9SAndroid Build Coastguard Worker  * @param[in,out]  threadpool  The thread pool to destroy.
164*da0073e9SAndroid Build Coastguard Worker  */
165*da0073e9SAndroid Build Coastguard Worker void legacy_pthreadpool_destroy(legacy_pthreadpool_t threadpool);
166*da0073e9SAndroid Build Coastguard Worker 
167*da0073e9SAndroid Build Coastguard Worker #ifdef USE_INTERNAL_PTHREADPOOL_IMPL
168*da0073e9SAndroid Build Coastguard Worker 
169*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_t legacy_pthreadpool_t
170*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_function_1d_t legacy_pthreadpool_function_1d_t
171*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_function_1d_tiled_t legacy_pthreadpool_function_1d_tiled_t
172*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_function_2d_t legacy_pthreadpool_function_2d_t
173*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_function_2d_tiled_t legacy_pthreadpool_function_2d_tiled_t
174*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_function_3d_tiled_t legacy_pthreadpool_function_3d_tiled_t
175*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_function_4d_tiled_t legacy_pthreadpool_function_4d_tiled_t
176*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_create legacy_pthreadpool_create
177*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_destroy legacy_pthreadpool_destroy
178*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_get_threads_count legacy_pthreadpool_get_threads_count
179*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_compute_1d legacy_pthreadpool_compute_1d
180*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_parallelize_1d legacy_pthreadpool_parallelize_1d
181*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_compute_1d_tiled legacy_pthreadpool_compute_1d_tiled
182*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_compute_2d legacy_pthreadpool_compute_2d
183*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_compute_2d_tiled legacy_pthreadpool_compute_2d_tiled
184*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_compute_3d_tiled legacy_pthreadpool_compute_3d_tiled
185*da0073e9SAndroid Build Coastguard Worker #define pthreadpool_compute_4d_tiled legacy_pthreadpool_compute_4d_tiled
186*da0073e9SAndroid Build Coastguard Worker 
187*da0073e9SAndroid Build Coastguard Worker #endif /* USE_INTERNAL_PTHREADPOOL_IMPL */
188*da0073e9SAndroid Build Coastguard Worker 
189*da0073e9SAndroid Build Coastguard Worker #ifdef __cplusplus
190*da0073e9SAndroid Build Coastguard Worker } /* extern "C" */
191*da0073e9SAndroid Build Coastguard Worker #endif
192*da0073e9SAndroid Build Coastguard Worker 
193*da0073e9SAndroid Build Coastguard Worker #endif // CAFFE2_UTILS_PTHREADPOOL_H_
194