source: libcfa/src/concurrency/cofor.hfa@ a738c68

Last change on this file since a738c68 was 1ed5e9e, checked in by caparsons <caparson@…>, 2 years ago

Added cfa equivalent of cofor/cobegin/coend

  • Property mode set to 100644
File size: 1.9 KB
Line 
1#include <thread.hfa>
2
3//////////////////////////////////////////////////////////////////////////////////////////
4// cofor ( uC++ COFOR )
5typedef void (*cofor_body_t)( long );
6thread co_runner {
7 long lo, hi;
8 cofor_body_t loop_body;
9};
10
11void ?{}( co_runner & this, long lo, long hi, cofor_body_t loop_body ) {
12 this.lo = lo;
13 this.hi = hi;
14 this.loop_body = loop_body;
15}
16
17void main( co_runner & this ) with( this ) {
18 for ( long i = lo; i < hi; i++ )
19 loop_body(i);
20}
21
22void cofor( long lo, long hi, cofor_body_t loop_body ) {
23 long range = hi - lo;
24 if ( range <= 0 ) return;
25 long nprocs = get_proc_count( *active_cluster() );
26 if ( nprocs == 0 ) return;
27 long threads = range < nprocs ? range : nprocs;
28 long stride = range / threads + 1, extras = range % threads;
29 long i = 0;
30 long stride_iter = lo;
31 co_runner * runners[ threads ];
32 for ( i; threads ) {
33 runners[i] = alloc();
34 }
35 for ( i = 0; i < extras; i += 1, stride_iter += stride ) {
36 (*runners[i]){ stride_iter, stride_iter + stride, loop_body };
37 }
38 stride -= 1;
39 for ( ; i < threads; i += 1, stride_iter += stride ) {
40 (*runners[i]){ stride_iter, stride_iter + stride, loop_body };
41 }
42 for ( i; threads ) {
43 delete( runners[i] );
44 }
45}
46
47//////////////////////////////////////////////////////////////////////////////////////////
48// parallel (COBEGIN/COEND)
49typedef void (*parallel_stmt_t)( void * );
50thread para_runner {
51 parallel_stmt_t body;
52 void * arg;
53};
54
55void ?{}( para_runner & this, parallel_stmt_t body, void * arg ) {
56 this.body = body;
57 this.arg = arg;
58}
59
60void main( para_runner & this ) with( this ) { body( arg ); }
61
62void parallel( parallel_stmt_t * stmts, void ** args, size_t num ) {
63 para_runner * runners[ num ];
64 for ( i; num )
65 (*(runners[i] = malloc())){ stmts[i], args[i] };
66 for ( i; num )
67 delete( runners[i] );
68}
69
Note: See TracBrowser for help on using the repository browser.