#include <omp.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>  /* sleep() */
#define CHUNKSIZE 100
#define N     100000
#define Ninner     2000

void process(int threads) {
    int i,j, chunk;
    float a[N], b[N], c[N];

    clock_t c0, c1;
    struct timeval t0, t1;
    

    /* Some initializations */
    for (i=0; i < N; i++)
      a[i] = b[i] = i * 1.0;
    chunk = CHUNKSIZE;
    printf("running with %i threads: ",threads);


    c0 = clock();
    gettimeofday(&t0,NULL);

    #pragma omp parallel num_threads(threads) shared(a,b,c,chunk) private(i,j)
      {
      // int id =  omp_get_thread_num();
      // printf("thread %i \n",id);
      #pragma omp for schedule(dynamic,chunk) nowait
      for (i=0; i < N; i++) {
        for (j=0; j<Ninner; j++) {
            c[i] = sqrt(sqrt(a[i])) + sin(cos(b[i])) + sqrt(j);
        }
      }

      }  /* end of parallel section, implicit barrier here(?) */

    c1 = clock();
    gettimeofday(&t1,NULL);

    //printf("difftime=%.4lf s\n",difftime(end, start));
    double runtime = (double)(t1.tv_sec-t0.tv_sec) + (double)(t1.tv_usec-t0.tv_usec)/1e6;

    printf("runtime = %f s  ",runtime);
    printf("clock=%f\n",(float)(c1 - c0)/CLOCKS_PER_SEC);
    return;
}

main ()  
{
    int i;
    for (i=1;i<9;i++) {
        process(i);  
        sleep(3);
    }
    return 0;
}

