Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/time.h>
- #include <sys/param.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <xmmintrin.h>
- #define N 40000000
- double gettime ()
- {
- struct timeval tv;
- gettimeofday (&tv, 0);
- return (double)tv.tv_sec + (0.000001 * (double)tv.tv_usec);
- }
- float calc_avg1 (const float array[], int n)
- {
- int i;
- float res = 0;
- for (i = 0; i < n; i++) res += array[i];
- return res/n;
- }
- float calc_avg2 (const float array[], int n)
- {
- float a1=0, a2=0, a3=0, a4=0;
- int i;
- for (i=0; i<n; i+=4)
- {
- a1 += array[i];
- a2 += array[i+1];
- a3 += array[i+2];
- a4 += array[i+3];
- }
- return (a1 + a2 + a3 + a4)/n;
- }
- float calc_avg3 (const float array[], int n)
- {
- int i;
- __v4sf r = _mm_set1_ps (0.0);
- for (i=0; i<n; i+=4) r += _mm_load_ps (&(array[i]));
- return (r[0] + r[1] + r[2] + r[3]) / n;
- }
- int main ()
- {
- void *space = malloc (N*sizeof(float)+15);
- float *array = (float*)(((unsigned long)space+15) & ~(unsigned long)15);
- int i;
- double time;
- float avg;
- for (i = 0; i < N; i++) array[i] = 1.0 * random();
- time = gettime();
- avg = calc_avg1 (array, N);
- time = gettime() - time;
- printf ("%f %f\n", time, avg);
- time = gettime();
- avg = calc_avg2 (array, N);
- time = gettime() - time;
- printf ("%f %f\n", time, avg);
- time = gettime();
- avg = calc_avg3 (array, N);
- time = gettime() - time;
- printf ("%f %f\n", time, avg);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement