source: CIVL/examples/omp/DataRaceBench/micro-benchmarks/adi-parallel-no.c@ e5cec5ae

1.23 2.0 main test-branch
Last change on this file since e5cec5ae was 36a61f3, checked in by Ziqing Luo <ziqing@…>, 9 years ago

Commit DataRaceBench into CIVL examples

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

  • Property mode set to 100644
File size: 4.0 KB
RevLine 
[36a61f3]1/**
2 * adi.c: This file is part of the PolyBench/C 3.2 test suite.
3 *
4 * Alternating Direction Implicit solver:
5 *
6 * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
7 * Web address: http://polybench.sourceforge.net
8 */
9#include <stdio.h>
10#include <unistd.h>
11#include <string.h>
12#include <math.h>
13/* Include polybench common header. */
14#include <polybench.h>
15/* Include benchmark-specific header. */
16/* Default data type is double, default size is 10x1024x1024. */
17#include "adi.h"
18/* Array initialization. */
19
20static void init_array(int n,double X[500 + 0][500 + 0],double A[500 + 0][500 + 0],double B[500 + 0][500 + 0])
21{
22 int i;
23 int j;
24{
25 int c1;
26 int c2;
27 if (n >= 1) {
28#pragma omp parallel for private(c2)
29 for (c1 = 0; c1 <= n + -1; c1++) {
30 for (c2 = 0; c2 <= n + -1; c2++) {
31 X[c1][c2] = (((double )c1) * (c2 + 1) + 1) / n;
32 A[c1][c2] = (((double )c1) * (c2 + 2) + 2) / n;
33 B[c1][c2] = (((double )c1) * (c2 + 3) + 3) / n;
34 }
35 }
36 }
37 }
38}
39/* DCE code. Must scan the entire live-out data.
40 Can be used also to check the correctness of the output. */
41
42static void print_array(int n,double X[500 + 0][500 + 0])
43{
44 int i;
45 int j;
46 for (i = 0; i < n; i++)
47 for (j = 0; j < n; j++) {
48 fprintf(stderr,"%0.2lf ",X[i][j]);
49 if ((i * 500 + j) % 20 == 0)
50 fprintf(stderr,"\n");
51 }
52 fprintf(stderr,"\n");
53}
54/* Main computational kernel. The whole function will be timed,
55 including the call and return. */
56
57static void kernel_adi(int tsteps,int n,double X[500 + 0][500 + 0],double A[500 + 0][500 + 0],double B[500 + 0][500 + 0])
58{
59 int t;
60 int i1;
61 int i2;
62
63#pragma scop
64{
65 int c0;
66 int c2;
67 int c8;
68 for (c0 = 0; c0 <= 9; c0++) {
69#pragma omp parallel for private(c8)
70 for (c2 = 0; c2 <= 499; c2++) {
71 for (c8 = 1; c8 <= 499; c8++) {
72 B[c2][c8] = B[c2][c8] - A[c2][c8] * A[c2][c8] / B[c2][c8 - 1];
73 }
74 for (c8 = 1; c8 <= 499; c8++) {
75 X[c2][c8] = X[c2][c8] - X[c2][c8 - 1] * A[c2][c8] / B[c2][c8 - 1];
76 }
77 for (c8 = 0; c8 <= 497; c8++) {
78 X[c2][500 - c8 - 2] = (X[c2][500 - 2 - c8] - X[c2][500 - 2 - c8 - 1] * A[c2][500 - c8 - 3]) / B[c2][500 - 3 - c8];
79 }
80 }
81#pragma omp parallel for
82 for (c2 = 0; c2 <= 499; c2++) {
83 X[c2][500 - 1] = X[c2][500 - 1] / B[c2][500 - 1];
84 }
85#pragma omp parallel for private(c8)
86 for (c2 = 0; c2 <= 499; c2++) {
87 for (c8 = 1; c8 <= 499; c8++) {
88 B[c8][c2] = B[c8][c2] - A[c8][c2] * A[c8][c2] / B[c8 - 1][c2];
89 }
90 for (c8 = 1; c8 <= 499; c8++) {
91 X[c8][c2] = X[c8][c2] - X[c8 - 1][c2] * A[c8][c2] / B[c8 - 1][c2];
92 }
93 for (c8 = 0; c8 <= 497; c8++) {
94 X[500 - 2 - c8][c2] = (X[500 - 2 - c8][c2] - X[500 - c8 - 3][c2] * A[500 - 3 - c8][c2]) / B[500 - 2 - c8][c2];
95 }
96 }
97#pragma omp parallel for
98 for (c2 = 0; c2 <= 499; c2++) {
99 X[500 - 1][c2] = X[500 - 1][c2] / B[500 - 1][c2];
100 }
101 }
102 }
103
104#pragma endscop
105}
106
107int main(int argc,char **argv)
108{
109/* Retrieve problem size. */
110 int n = 500;
111 int tsteps = 10;
112/* Variable declaration/allocation. */
113 double (*X)[500 + 0][500 + 0];
114 X = ((double (*)[500 + 0][500 + 0])(polybench_alloc_data(((500 + 0) * (500 + 0)),(sizeof(double )))));
115 ;
116 double (*A)[500 + 0][500 + 0];
117 A = ((double (*)[500 + 0][500 + 0])(polybench_alloc_data(((500 + 0) * (500 + 0)),(sizeof(double )))));
118 ;
119 double (*B)[500 + 0][500 + 0];
120 B = ((double (*)[500 + 0][500 + 0])(polybench_alloc_data(((500 + 0) * (500 + 0)),(sizeof(double )))));
121 ;
122/* Initialize array(s). */
123 init_array(n, *X, *A, *B);
124/* Start timer. */
125 polybench_timer_start();
126 ;
127/* Run kernel. */
128 kernel_adi(tsteps,n, *X, *A, *B);
129/* Stop and print timer. */
130 polybench_timer_stop();
131 ;
132 polybench_timer_print();
133 ;
134/* Prevent dead-code elimination. All live-out data must be printed
135 by the function call in argument. */
136 if (argc > 42 && !strcmp(argv[0],""))
137 print_array(n, *X);
138/* Be clean. */
139 free(((void *)X));
140 ;
141 free(((void *)A));
142 ;
143 free(((void *)B));
144 ;
145 return 0;
146}
Note: See TracBrowser for help on using the repository browser.