#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void create_randam_array(int n, double *x){
  int i;

  for(i = 0; i < n; i++){
    x[i] = 123.45*(i+1);
  }
}

double norm(int n, double *x){
  int i;
  double s;
  
  s = 0.0;
  for(i = 0; i < n; i++){
    s += x[i] * x[i];
  }
  return s;
}

double perf(int n, double *x){
  int k, t;
  double s;
  
  t=clock();
  for(k = 0; k < 1000000000/n; k++){
    s = norm(n, x);
  }
  return 2.0 * n * k / (clock() - t);
}

int main(int argc, char *argv[]) {
  FILE *fp;
  int num, start, end;
  double *data;
  double result;

  if (argc != 3){
    exit(1);
  }

  start= atoi(argv[1]);
  end = atoi(argv[2]);
  
  if((fp = fopen("cache.dat","w")) == NULL){
    printf("file open error\n");
    exit(1);
  }

  printf("num\tbyte\tMflops\n");
  fprintf(fp, "#num\tbyte\tMflops\n");

  for(num=start; num<=end; num *= 2){//from 16byte to 4MB
    data = (double*)malloc(num * sizeof(double));
    create_randam_array(num, data);
    result = perf(num, data);
    printf("%d\t%d\t%f\n", num, num*sizeof(double), result);
    fprintf(fp, "%d\t%d\t%f\n", num, num*sizeof(double), result);

    free(data);
  }
  fclose(fp);
}
