source: CIVL/examples/compare/adder/adder_par.cvl@ 85b7e48

1.23 2.0 main test-branch
Last change on this file since 85b7e48 was 11cc8de, checked in by Manchun Zheng <zmanchun@…>, 12 years ago

minor corrections of tests: updated header files that were added wrongly; reduced console output.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@1479 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<civlmpi.cvh>
22
23$input int NPROCS;
24$input int NPROCSB;
25$input int N;
26$input int NB;
27$input double a[N];
28$output double SUM;
29$assume 0 < N && N < NB;
30$assume 0 < NPROCS && NPROCS <= NPROCSB;
31$assume NPROCS <= N;
32
33CMPI_Gcomm __MPI_COMM_WORLD;
34
35void MPI_Process(int place){
36 double sum;
37 double localSum = 0.0;
38 int PID;
39 int nprocs;
40 MPI_Comm MPI_COMM_WORLD;
41
42 double computeGlobalSum() {
43 double result = localSum;
44 double buffer;
45 int i;
46 MPI_Status status;
47
48 for (i=1; i<nprocs; i++) {
49 MPI_Recv(&buffer, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, &status);
50 result += buffer;
51 }
52 return result;
53 }
54
55 int _main() {
56
57 int first;
58 int afterLast;
59 int i;
60
61 MPI_COMM_WORLD = CMPI_Comm_create($here, __MPI_COMM_WORLD, place);
62 __MPI_Init(&MPI_COMM_WORLD);
63 MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
64 MPI_Comm_rank(MPI_COMM_WORLD, &PID);
65 first = N * PID / nprocs;
66 afterLast = N * (PID + 1) / nprocs;
67
68 for (i=first; i<afterLast; i++) localSum += a[i];
69 if (PID == 0) {
70 sum = computeGlobalSum();
71 SUM = sum;
72 printf("%lf\n", sum);
73 } else {
74 MPI_Send(&localSum, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
75 }
76 __MPI_Finalize(&MPI_COMM_WORLD);
77 CMPI_Comm_destroy(MPI_COMM_WORLD);
78 return 0;
79 }
80
81 _main();
82}
83
84void main(){
85 for(int i = 0; i<NPROCS; i++);
86 for(int i = 0; i<N; i++);
87
88 $proc procs[NPROCS];
89
90 __MPI_COMM_WORLD = CMPI_Gcomm_create($root, NPROCS);
91 for(int i = 0; i<NPROCS; i++)
92 procs[i] = $spawn MPI_Process(i);
93 for(int i = 0; i<NPROCS; i++)
94 $wait(procs[i]);
95 CMPI_Gcomm_destroy(__MPI_COMM_WORLD);
96}
Note: See TracBrowser for help on using the repository browser.