blob: 791052d25f0dc2c9857ad49681d67c28376c6a2b [file] [log] [blame]
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <math.h>
#include "instrument.h"
/* Default problem size. */
#ifndef TSTEPS
# define TSTEPS 20
#endif
#ifndef N
# define N 1024
#endif
/* Default data type is double. */
#ifndef DATA_TYPE
# define DATA_TYPE double
#endif
#ifndef DATA_PRINTF_MODIFIER
# define DATA_PRINTF_MODIFIER "%0.2lf "
#endif
/* Array declaration. Enable malloc if POLYBENCH_TEST_MALLOC. */
#ifndef POLYBENCH_TEST_MALLOC
DATA_TYPE A[N][N];
DATA_TYPE B[N][N];
#else
DATA_TYPE** A = (DATA_TYPE**)malloc(N * sizeof(DATA_TYPE*));
DATA_TYPE** B = (DATA_TYPE**)malloc(N * sizeof(DATA_TYPE*));
{
int i;
for (i = 0; i < N; ++i)
{
A[i] = (DATA_TYPE*)malloc(N * sizeof(DATA_TYPE));
B[i] = (DATA_TYPE*)malloc(N * sizeof(DATA_TYPE));
}
}
#endif
inline
void init_array()
{
int i, j;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
{
A[i][j] = ((DATA_TYPE) i*j + 10) / N;
B[i][j] = ((DATA_TYPE) i*j + 11) / N;
}
}
/* Define the live-out variables. Code is not executed unless
POLYBENCH_DUMP_ARRAYS is defined. */
inline
void print_array(int argc, char** argv)
{
int i, j;
#ifndef POLYBENCH_DUMP_ARRAYS
if (argc > 42 && ! strcmp(argv[0], ""))
#endif
{
for (i = 0; i < N; i++)
for (j = 0; j < N; j++) {
fprintf(stderr, DATA_PRINTF_MODIFIER, A[i][j]);
if ((i * N + j) % 80 == 20) fprintf(stderr, "\n");
}
fprintf(stderr, "\n");
}
}
#ifndef SCOP_PARAM
void scop_func() {
long n = N;
#else
void scop_func(long n) {
#endif
long t, i, j;
long tsteps = TSTEPS;
#pragma scop
#pragma live-out A
for (t = 0; t < tsteps; t++)
{
for (i = 2; i < n - 1; i++)
for (j = 2; j < n - 1; j++)
B[i][j] = 0.2 * (A[i][j] + A[i][j-1] + A[i][1+j] + A[1+i][j] + A[i-1][j]);
for (i = 2; i < n-1; i++)
for (j = 2; j < n-1; j++)
A[i][j] = B[i][j];
}
#pragma endscop
}
int main(int argc, char** argv)
{
int t, i, j;
int tsteps = TSTEPS;
int n = N;
/* Initialize array. */
init_array();
/* Start timer. */
polybench_start_instruments;
#ifndef SCOP_PARAM
scop_func();
#else
scop_func(n);
#endif
/* Stop and print timer. */
polybench_stop_instruments;
polybench_print_instruments;
print_array(argc, argv);
return 0;
}