#include <stdio.h> #include <math.h> #define n 30 #define work 10000 void init(double a[n][n]) { /* initial values for a: a(i,j) = i+j */ int i,j; for (i=0; i<n; i++) { for (j=0; j<n; j++) { a[i][j] = i + j + 2; } } } void check(double v[n]) { /* check results */ /* here: print total sum */ double sum1, sum2; int i; sum1 = 0; for (i=0; i<n; i++) { sum1 += v[i]; } sum2 = n*n*n + n*n; printf("sum is : %lf\n", sum1); printf("and should be: %lf\n", sum2); } double f(double x, int w) { /* time consuming way of setting f = x + eps */ int i; double t1, t2; t1 = x; for (i=0; i<w; i++) { t1 = cos(t1); } t2 = x; for (i=0; i<w; i++) { t2 = sin(t2); } return x + t1 + t2 - 0.7390851332151607; } int main(int argc, char *argv[]) { double a[n][n]; double v[n]; int i, j; for (i=0; i<n; i++) { v[i] = 0.0; } init(a); /* initial values for a */ #pragma omp parallel { #pragma omp for for (i=0; i<n; i++) { for (j=0; j<n; j++) { v[i] = v[i] + f(a[i][j], work); } } } check(v); /* check result */ }