source: CIVL/examples/compare/adder/adder_par.cvl@ 83af34d

1.23 2.0 main test-branch
Last change on this file since 83af34d was 3af26ac, checked in by Manchun Zheng <zmanchun@…>, 11 years ago

make library names consistent; clean up stdlib library; fixed examples accordingly.

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

  • Property mode set to 100644
File size: 2.2 KB
RevLine 
[1efcf3a]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
[11cc8de]18#include<civlc.cvh>
[1efcf3a]19#include<stdio.h>
20#include<mpi.h>
[3af26ac]21#include<civl-mpi.cvh>
[a96092d]22#include<assert.h>
[1efcf3a]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
34CMPI_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;
[a96092d]42 __MPI_Sys_status__ _my_status = __UNINIT;
[1efcf3a]43
[a96092d]44 $assert _my_status == __UNINIT;
[1efcf3a]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
[b441403]64 MPI_COMM_WORLD = CMPI_Comm_create($here, __MPI_COMM_WORLD, place);
[a96092d]65 __MPI_Init();
[1efcf3a]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 }
[a96092d]79 __MPI_Finalize();
[b441403]80 CMPI_Comm_destroy(MPI_COMM_WORLD);
[1efcf3a]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 = CMPI_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 CMPI_Gcomm_destroy(__MPI_COMM_WORLD);
99}
Note: See TracBrowser for help on using the repository browser.