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