Changeset 368 for soft/giet_vm/giet_libs/barrier.h
- Timestamp:
- Jul 31, 2014, 8:47:14 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
soft/giet_vm/giet_libs/barrier.h
r295 r368 5 5 // Copyright (c) UPMC-LIP6 6 6 /////////////////////////////////////////////////////////////////////////////////// 7 // The barrier.c and barrier.h files are part of the GIET-VM nano-kernel. 8 // This user-level library provides a synchronisation service between several 9 // tasks sharing the same address space in a parallel multi-tasks application. 10 // 11 // There is actually two types of barriers: 12 // 1) The "giet_barrier_t" is a simple sense-reversing barrier. 13 // It can be safely used several times (in a loop for example), 14 // but it does not scale, and should not be used when the number 15 // of tasks is larger than few tens. 16 // 17 // 2) The giet_sbt_barrier_t" can be used in multi-clusters architectures, 18 // and is implemented as a physically distributed Sliced-Binary-Tree (SBT). 19 // WARNING: The following placement constraints must be respected: 20 // - The number of tasks must be a power of 2. 21 // - There is one task per processor in a given cluster. 22 // - The involved clusters form a mesh[N][N] or a mesh[N][N/2] 23 // - The lower left involved cluster is cluster(0,0) 24 // 25 // Neither the barrier_init(), nor the barrier_wait() function require a syscall. 26 // For both types of barriers, the barrier initialisation should be done by 27 // one single task. 28 /////////////////////////////////////////////////////////////////////////////////// 7 29 8 30 #ifndef _BARRIER_H_ 9 31 #define _BARRIER_H_ 10 32 33 #include "hard_config.h" 34 11 35 /////////////////////////////////////////////////////////////////////////////////// 12 // barrier structure 36 /////////////////////////////////////////////////////////////////////////////////// 37 // simple barrier structure and access functions 38 /////////////////////////////////////////////////////////////////////////////////// 13 39 /////////////////////////////////////////////////////////////////////////////////// 14 40 15 41 typedef struct giet_barrier_s 16 42 { 17 char name[32]; // barrier name 18 unsigned int init; // total number of participants 19 unsigned int count; // number of not yet arrived tasks 43 char name[32]; // barrier name 44 unsigned int sense; // barrier state (toggle) 45 unsigned int ntasks; // total number of expected tasks 46 unsigned int count; // number of not arrived tasks 20 47 } giet_barrier_t; 21 48 22 /////////////////////////////////////////////////// ///////////////////////////23 // access functions 24 ////////////////////////////////////////////////////////////////////////////// 49 /////////////////////////////////////////////////// 50 extern void barrier_init( giet_barrier_t* barrier, 51 unsigned int ntasks ); 25 52 26 void barrier_init( giet_barrier_t* barrier, 27 unsigned int value ); // number of tasks 53 //////////////////////////////////////////////////// 54 extern void barrier_wait( giet_barrier_t* barrier ); 28 55 29 void barrier_wait( giet_barrier_t* barrier ); 56 /////////////////////////////////////////////////////////////////////////////////// 57 ////////////////////////////////////////////////////////////////////////////////// 58 // SBT barrier structures and access functions 59 ////////////////////////////////////////////////////////////////////////////////// 60 ////////////////////////////////////////////////////////////////////////////////// 61 62 typedef struct sbt_node_s 63 { 64 unsigned int arity; // number of children (must be 2 or 4) 65 unsigned int count; // number of not arrived children 66 unsigned int sense; // barrier state (toggle) 67 unsigned int level; // hierarchical level (0 is bottom) 68 struct sbt_node_s* parent; // pointer on parent node (NULL for root) 69 struct sbt_node_s* child0; // pointer on children node 70 struct sbt_node_s* child1; // pointer on children node 71 } sbt_node_t; 72 73 #define SBT_NODE_SIZE 32 74 75 typedef struct giet_sbt_barrier_s 76 { 77 char name[32]; // barrier name 78 unsigned int ntasks; // total number of expected tasks 79 sbt_node_t* node[X_SIZE][Y_SIZE][9]; // array of pointers on SBT nodes 80 } giet_sbt_barrier_t; 81 82 /////////////////////////////////////////////////////////// 83 extern void sbt_barrier_init( giet_sbt_barrier_t* barrier, 84 unsigned int ntasks ); 85 86 ///////////////////////////////////////////////////////////// 87 extern void sbt_barrier_wait( giet_sbt_barrier_t* barrier ); 88 89 ///////////////////////////////////////////// 90 void sbt_build( giet_sbt_barrier_t* barrier, 91 unsigned int x, 92 unsigned int y, 93 unsigned int level, 94 sbt_node_t* parent ); 95 96 /////////////////////////////////////// 97 void sbt_decrement( sbt_node_t* node ); 98 99 /////////////////////////////////// 100 void sbt_release( sbt_node_t* node, 101 unsigned int expected ); 102 103 30 104 31 105 #endif
Note: See TracChangeset
for help on using the changeset viewer.