source: CIVL/examples/compare/adder/adder_par.cvl@ e2877ba

1.23 2.0 main test-branch
Last change on this file since e2877ba was db66e7f, checked in by Ziqing Luo <ziqing@…>, 11 years ago

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

  • Property mode set to 100644
File size: 2.2 KB
Line 
1/*****************************************
2 * SOURCE: adder_par.c by vsl@udel
3 * The source program is included in FEVS
4 * vsl.cis.udel.edu/fevs
5 * FILE: adder_par.cvl
6 * DESCRIPTION: This a manually translated
7 * CIVL program which is based on "adder_par.c"
8 * This program sums all elements of an array
9 * up.
10 *
11 * AUTHOR: Ziqing Luo
12 * COMMANS: civl verify adder_par.cvl
13 * -inputNPROCSB=5 -inputNB=10
14 * or
15 * make civl
16 *****************************************/
17
18#include<civlc.cvh>
19#include<stdio.h>
20#include<mpi.h>
21#include<civl-mpi.cvh>
22#include<assert.h>
23
24$input int NPROCS;
25$input int NPROCSB;
26$input int N;
27$input int NB;
28$input double a[N];
29$output double SUM;
30$assume(0 < N && N < NB);
31$assume(0 < NPROCS && NPROCS <= NPROCSB);
32$assume(NPROCS <= N);
33
34$mpi_gcomm __MPI_COMM_WORLD;
35
36void _mpi_process(int place){
37 double sum;
38 double localSum = 0.0;
39 int PID;
40 int nprocs;
41 MPI_Comm MPI_COMM_WORLD;
42 $mpi_sys_status _mpi_status = __UNINIT;
43
44 $assert(_mpi_status == __UNINIT);
45 double computeGlobalSum() {
46 double result = localSum;
47 double buffer;
48 int i;
49 MPI_Status status;
50
51 for (i=1; i<nprocs; i++) {
52 MPI_Recv(&buffer, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, &status);
53 result += buffer;
54 }
55 return result;
56 }
57
58 int _main() {
59
60 int first;
61 int afterLast;
62 int i;
63
64 MPI_COMM_WORLD = $mpi_comm_create($here, __MPI_COMM_WORLD, place);
65 $mpi_init();
66 MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
67 MPI_Comm_rank(MPI_COMM_WORLD, &PID);
68 first = N * PID / nprocs;
69 afterLast = N * (PID + 1) / nprocs;
70
71 for (i=first; i<afterLast; i++) localSum += a[i];
72 if (PID == 0) {
73 sum = computeGlobalSum();
74 SUM = sum;
75 printf("%lf\n", sum);
76 } else {
77 MPI_Send(&localSum, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
78 }
79 $mpi_finalize();
80 $mpi_comm_destroy(MPI_COMM_WORLD);
81 return 0;
82 }
83
84 _main();
85}
86
87void main(){
88 for(int i = 0; i<NPROCS; i++);
89 for(int i = 0; i<N; i++);
90
91 $proc procs[NPROCS];
92
93 __MPI_COMM_WORLD = $mpi_gcomm_create($root, NPROCS);
94 for(int i = 0; i<NPROCS; i++)
95 procs[i] = $spawn _mpi_process(i);
96 for(int i = 0; i<NPROCS; i++)
97 $wait(procs[i]);
98 $mpi_gcomm_destroy(__MPI_COMM_WORLD);
99}
Note: See TracBrowser for help on using the repository browser.