Guest User

Untitled

a guest
Jan 25th, 2014
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.03 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4.  
  5. double clock_now(void) {
  6.   struct timeval now;
  7.   gettimeofday(&now, NULL);
  8.   return (double)now.tv_sec + (double)now.tv_usec/1.0e6;
  9. }
  10.  
  11. double pisum(void) {
  12.   double sum = 0.0;
  13.   for (int j=0; j<500; ++j) {
  14.     sum = 0.0;
  15.     for (int k=1; k<=10000; ++k) {
  16.       sum += 1.0/(k*k);
  17.     }
  18.   }
  19.   return sum;
  20. }
  21.  
  22. typedef double v4df __attribute__((vector_size(32)));
  23.  
  24. inline v4df v4df_set(double a, double b, double c, double d) {return (v4df){a, b, c, d};}
  25. inline v4df v4df_set1(double a) {return (v4df){a, a, a, a};}
  26. inline double v4df_getn(v4df v, uint64_t n) { return v[n];}
  27. inline double v4df_vecsum(v4df v) { return (v[0] + v[1] + v[2] + v[3]);}
  28.  
  29. double p2vec(void) {
  30.   v4df add = v4df_set1(4.);
  31.   v4df sum = v4df_set1(0.), it = v4df_set(1., 2., 3., 4.), one = v4df_set1(1.);
  32.   do {
  33.     sum += (one/(it * it));
  34.     it += add;
  35.   } while(v4df_getn(it, 3) <= 10000.);
  36.   return v4df_vecsum(sum);
  37. }
  38.  
  39. double p2(void) {
  40.   double i = 1., sum = 0.;
  41.   do {
  42.     sum += 1./(i*i);
  43.   } while(++i <= 10000);
  44.   return sum;
  45. }
  46.  
  47. double pisum_sphk(typeof(p2) f) {
  48.   uint64_t i = 500;
  49.   double sum = 0.;
  50.   do {
  51.     double j = 1.; sum = 0.;
  52.     sum += f();
  53.   } while(--i);
  54.   return sum;
  55. }
  56.  
  57. double test(typeof(pisum) f) {
  58.   double ret = 0;
  59.   uint64_t i = 30;
  60.   do {
  61.     ret += f();
  62.   } while(--i);
  63.   return ret;
  64. }
  65.  
  66. #define bind(f, arg) ({typeof(f(arg)) new(void) { return f(arg);} new;})
  67.  
  68. int main(void) {
  69.   {
  70.     double start = clock_now();
  71.     double res = test(bind(pisum_sphk, p2vec));
  72.     double end = clock_now();
  73.     fprintf(stderr, "SPHK_vec:\t %0.10f, %fsec\n", res, (end - start));
  74.   }
  75.   {
  76.     double start = clock_now();
  77.     double res = test(bind(pisum_sphk, p2));
  78.     double end = clock_now();
  79.     fprintf(stderr, "SPHK:\t\t %0.10f, %fsec\n", res, (end - start));
  80.   }
  81.   {
  82.     double start = clock_now();
  83.     double res = test(pisum);
  84.     double end = clock_now();
  85.     fprintf(stderr, "SHIT:\t\t %0.10f, %fsec\n", res, (end - start));
  86.   }
  87. }
Advertisement
Add Comment
Please, Sign In to add comment