source: libcfa/src/concurrency/cofor.cfa @ bf1cbde

Last change on this file since bf1cbde was 11ab0b4a, checked in by Peter A. Buhr <pabuhr@…>, 9 months ago

add corun/cofor statement, update old cofor

  • Property mode set to 100644
File size: 1.8 KB
Line 
1#include <cofor.hfa>
2
3//////////////////////////////////////////////////////////////////////////////////////////
4// cofor ( uC++ COFOR )
5
6thread co_runner {
7        ssize_t low, high;
8        __cofor_body_t loop_body;
9};
10
11static void ?{}( co_runner & this, ssize_t low, ssize_t high, __cofor_body_t loop_body ) {
12        this.low = low;
13        this.high = high;
14        this.loop_body = loop_body;
15}
16
17void main( co_runner & this ) with( this ) {
18        for ( ssize_t i = low; i < high; i++ )
19                loop_body(i);
20}
21
22void __Cofor__( ssize_t low, ssize_t high, __cofor_body_t loop_body ) libcfa_public {
23        ssize_t range = high - low;
24  if ( range <= 0 ) return;
25        ssize_t nprocs = get_proc_count( *active_cluster() );
26  if ( nprocs == 0 ) return;
27        ssize_t threads = range < nprocs ? range : nprocs;
28        ssize_t stride = range / threads + 1, extras = range % threads;
29        ssize_t i = 0;
30        ssize_t stride_iter = low;
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)
49
50thread para_runner {
51        parallel_stmt_t body;
52        void * arg;
53};
54
55static void ?{}( 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 ) libcfa_public {
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.