source: CIVL/examples/concurrency/adders.cvl@ 8585438

1.23 2.0 acw/focus-triggers main test-branch
Last change on this file since 8585438 was 8585438, checked in by Stephen Siegel <siegel@…>, 13 years ago

Adding another adders example that is a little more realistic
in how it divides up work among procs.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@203 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 762 bytes
Line 
1/* Compare sequential and parallel sum of array */
2#include<civlc.h>
3$input int N;
4$assume N>=0;
5$input int P;
6$assume P>=1;
7$input double a[N];
8double sum_seq;
9double sum_par;
10
11void adder_seq() {
12 sum_seq = 0.0;
13 for (int i=0; i<N; i++)
14 sum_seq += a[i];
15}
16
17void adder_par() {
18 $proc workers[P];
19 int lock = 0;
20
21 void run_worker(int id) {
22 int start = (id*N)/P;
23 int stop = ((id+1)*N)/P;
24 double localSum = 0.0;
25
26 for (int i=start; i<stop; i++)
27 localSum += a[i];
28 $when (lock==0) lock = 1;
29 sum_par += localSum;
30 lock = 0;
31 }
32
33 for (int i=0; i<P; i++)
34 workers[i] = $spawn run_worker(i);
35 for (int i=0; i<P; i++)
36 $wait workers[i];
37}
38
39void main() {
40 adder_seq();
41 adder_par();
42 $assert sum_seq == sum_par;
43}
Note: See TracBrowser for help on using the repository browser.