Advertisement
Guest User

Scalar average

a guest
Jul 11th, 2015
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.54 KB | None | 0 0
  1. #include <sys/time.h>
  2. #include <sys/param.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <xmmintrin.h>
  7.  
  8. #define N 40000000
  9.  
  10. double gettime ()
  11. {
  12.     struct timeval tv;
  13.     gettimeofday (&tv, 0);
  14.     return (double)tv.tv_sec + (0.000001 * (double)tv.tv_usec);
  15. }
  16.  
  17. float calc_avg1 (const float array[], int n)
  18. {
  19.     int i;
  20.     float res = 0;
  21.     for (i = 0; i < n; i++) res += array[i];
  22.     return res/n;
  23. }
  24.  
  25. float calc_avg2 (const float array[], int n)
  26. {
  27.     float a1=0, a2=0, a3=0, a4=0;
  28.     int i;
  29.     for (i=0; i<n; i+=4)
  30.     {
  31.         a1 += array[i];
  32.         a2 += array[i+1];
  33.         a3 += array[i+2];
  34.         a4 += array[i+3];
  35.     }
  36.     return (a1 + a2 + a3 + a4)/n;
  37. }
  38.  
  39. float calc_avg3 (const float array[], int n)
  40. {
  41.     int i;
  42.     __v4sf r = _mm_set1_ps (0.0);
  43.     for (i=0; i<n; i+=4) r += _mm_load_ps (&(array[i]));
  44.     return (r[0] + r[1] + r[2] + r[3]) / n;
  45. }
  46.  
  47. int main ()
  48. {
  49.     void *space = malloc (N*sizeof(float)+15);
  50.     float *array = (float*)(((unsigned long)space+15) & ~(unsigned long)15);
  51.  
  52.     int i;
  53.     double time;
  54.     float avg;
  55.  
  56.     for (i = 0; i < N; i++) array[i] = 1.0 * random();
  57.  
  58.     time = gettime();
  59.     avg = calc_avg1 (array, N);
  60.     time = gettime() - time;
  61.     printf ("%f %f\n", time, avg);
  62.  
  63.     time = gettime();
  64.     avg = calc_avg2 (array, N);
  65.     time = gettime() - time;
  66.     printf ("%f %f\n", time, avg);
  67.  
  68.     time = gettime();
  69.     avg = calc_avg3 (array, N);
  70.     time = gettime() - time;
  71.     printf ("%f %f\n", time, avg);
  72.  
  73.     return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement