Added the initial support of using pthreads for parallelization (a special SMP mode...
[charm.git] / NodeHelperAPI.h
1 #ifndef _NODEHELPERAPI_H
2 #define _NODEHELPERAPI_H
3
4 #include "NodeHelper.decl.h"
5
6 /* "result" is the buffer for reduction result on a single simple-type variable */
7 typedef void (*HelperFn)(int first,int last, void *result, int paramNum, void *param);
8
9 typedef enum REDUCTION_TYPE{
10     NODEHELPER_NONE=0,
11     NODEHELPER_INT_SUM,
12     NODEHELPER_FLOAT_SUM,
13     NODEHELPER_DOUBLE_SUM
14 }REDUCTION_TYPE;
15
16 #define NODEHELPER_USECHARM 1
17 #define NODEHELPER_PTHREAD 2
18
19 class CProxy_FuncNodeHelper;
20 /* 
21  * The default mode is intended to be used in SMP mode 
22  * The next mode that uses pthread is intended to be used in a restricted mode where
23  * a node just have one charm PE!
24  **/
25 extern CProxy_FuncNodeHelper NodeHelper_Init(int mode=NODEHELPER_USECHARM, int numThreads=0);
26
27 extern void NodeHelper_Exit(CProxy_FuncNodeHelper nodeHelper); /* used to free resources if using pthread mode. It should be called on just one PE, say PE 0 */                                                                         
28
29 extern void NodeHelper_Parallelize(
30                                                 CProxy_FuncNodeHelper nodeHelper, /* the proxy to the FuncNodeHelper instance */
31                                                 HelperFn func, /* the function that finishes a partial work on another thread */
32                         int paramNum, void * param, /* the input parameters for the above func */
33                         int numChunks, /* number of chunks to be partitioned */
34                         int lowerRange, int upperRange, /* the loop-like parallelization happens in [lowerRange, upperRange] */                        
35                         int sync=1, /* whether the flow will continue unless all chunks have finished */ 
36                         void *redResult=NULL, REDUCTION_TYPE type=NODEHELPER_NONE /* the reduction result, ONLY SUPPORT SINGLE VAR of TYPE int/float/double */
37                         );
38 #endif