Advertisement
Guest User

Untitled

a guest
Nov 27th, 2011
413
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.15 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/time.h>
  4.  
  5. typedef float v4sf __attribute__ ((mode(V4SF)));
  6.  
  7. #define SIZE    32
  8. #define ITER    1000000
  9.  
  10. float *mv_mult(float mat[SIZE][SIZE], float vec[SIZE]) {
  11.     static float ret[SIZE];
  12.     float temp[4];
  13.     int i, j;
  14.     v4sf m, v, r;
  15.  
  16.     for (i = 0; i < SIZE; i++) {
  17.         r = __builtin_ia32_xorps(r, r);
  18.  
  19.         for (j = 0; j < SIZE; j += 4) {
  20.             m = __builtin_ia32_loadups(&mat[i][j]);
  21.             v = __builtin_ia32_loadups(&vec[j]);
  22.             v = __builtin_ia32_mulps(m, v);
  23.             r = __builtin_ia32_addps(r, v);
  24.         }
  25.  
  26.         __builtin_ia32_storeups(temp, r);
  27.         ret[i] = temp[0] + temp[1] + temp[2] + temp[3];
  28.     }
  29.  
  30.     return ret;
  31. }
  32.  
  33. int main(int argc, char **argv) {
  34.     float mat[SIZE][SIZE];
  35.     float vec[SIZE];
  36.     int i, j;
  37.  
  38.     struct timeval start, end;
  39.  
  40.     for (i = 0; i < SIZE; i++) {
  41.         for (j = 0; j < SIZE; j++)
  42.             mat[i][j] = (float)i / (float)(j + 1);
  43.         vec[i] = (float)i;
  44.     }
  45.  
  46.     gettimeofday(&start, NULL);
  47.  
  48.     for (i = 0; i < ITER; i++)
  49.         mv_mult(mat, vec);
  50.  
  51.     gettimeofday(&end, NULL);
  52.  
  53.     i = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec);
  54.     printf("%d iterations, %d usec\n", ITER, i);
  55.  
  56.     return 0;
  57. }
  58.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement