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>
- typedef float dot[4];
- #define N 100000000
- double gettime ()
- {
- struct timeval tv;
- gettimeofday (&tv, 0);
- return (double)tv.tv_sec + (0.000001 * (double)tv.tv_usec);
- }
- void calc_avg1 (dot res, const dot array[], int n)
- {
- int i,j;
- memset (res, 0, sizeof (dot));
- for (i = 0; i < n; i++)
- {
- for (j = 0; j<4; j++) res[j] += array[i][j];
- }
- for (j = 0; j<4; j++) res[j] /= n;
- }
- void calc_avg2 (dot res, const dot array[], int n)
- {
- int i;
- __v4sf r = _mm_set1_ps (0.0);
- for (i=0; i<n; i++) r += _mm_load_ps (array[i]);
- r /= _mm_set1_ps ((float)n);
- _mm_store_ps (res, r);
- }
- int main ()
- {
- void *space = malloc (N*sizeof(dot)+15);
- dot *array = (dot*)(((unsigned long)space+15) & ~(unsigned long)15);
- dot avg __attribute__((aligned(16)));
- int i;
- double time;
- for (i = 0; i < N; i++)
- {
- array[i][0] = 1.0*random();
- array[i][1] = 1.0*random();
- array[i][2] = 1.0*random();
- }
- time = gettime();
- calc_avg1 (avg, array, N);
- time = gettime() - time;
- printf ("%f\n%f %f %f\n", time, avg[0], avg[1], avg[2]);
- time = gettime();
- calc_avg2 (avg, array, N);
- time = gettime() - time;
- printf ("%f\n%f %f %f\n", time, avg[0], avg[1], avg[2]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment