Advertisement
kubpica

Untitled

Mar 23rd, 2020
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. int i, j;
  2.     __m128d rx0, ra0, ra1, ra2, ra3, ry0, ry1, ry2, ry3;
  3.     double* ptr_x, * ptr_a;
  4.     __declspec(align(16)) double tmp0[2], tmp1[2], tmp2[2], tmp3[2];
  5.     memset((void*)y, 0, n * sizeof(double));
  6.     ptr_a = a;
  7.  
  8.     for (i = 0; i < n; i += 4) {
  9.         ry0 = ry1 = ry2 = ry3 = _mm_setzero_pd();
  10.         ptr_x = x;
  11.         for (j = 0; j < n; j += 8, ptr_a += 8, ptr_x += 8) {
  12.             rx0 = _mm_load_pd(ptr_x);
  13.             ra0 = _mm_load_pd(ptr_a);
  14.             ra1 = _mm_load_pd(ptr_a + n);
  15.             ra2 = _mm_load_pd(ptr_a + 2 * n);
  16.             ra3 = _mm_load_pd(ptr_a + 3 * n);
  17.             ra0 = _mm_mul_pd(ra0, rx0);
  18.             ry0 = _mm_add_pd(ry0, ra0);
  19.             ra1 = _mm_mul_pd(ra1, rx0);
  20.             ry1 = _mm_add_pd(ry1, ra1);
  21.             ra2 = _mm_mul_pd(ra2, rx0);
  22.             ry2 = _mm_add_pd(ry2, ra2);
  23.             ra3 = _mm_mul_pd(ra3, rx0);
  24.             ry3 = _mm_add_pd(ry3, ra3);
  25.             rx0 = _mm_load_pd(ptr_x + 2);
  26.             ra0 = _mm_load_pd(ptr_a + 2);
  27.             ra1 = _mm_load_pd(ptr_a + n + 2);
  28.             ra2 = _mm_load_pd(ptr_a + 2 * n + 2);
  29.             ra3 = _mm_load_pd(ptr_a + 3 * n + 2);
  30.             ra0 = _mm_mul_pd(ra0, rx0);
  31.             ry0 = _mm_add_pd(ry0, ra0);
  32.             ra1 = _mm_mul_pd(ra1, rx0);
  33.             ry1 = _mm_add_pd(ry1, ra1);
  34.             ra2 = _mm_mul_pd(ra2, rx0);
  35.             ry2 = _mm_add_pd(ry2, ra2);
  36.             ra3 = _mm_mul_pd(ra3, rx0);
  37.             ry3 = _mm_add_pd(ry3, ra3);
  38.             rx0 = _mm_load_pd(ptr_x + 4);
  39.             ra0 = _mm_load_pd(ptr_a + 4);
  40.             ra1 = _mm_load_pd(ptr_a + n + 4);
  41.             ra2 = _mm_load_pd(ptr_a + 2 * n + 4);
  42.             ra3 = _mm_load_pd(ptr_a + 3 * n + 4);
  43.             ra0 = _mm_mul_pd(ra0, rx0);
  44.             ry0 = _mm_add_pd(ry0, ra0);
  45.             ra1 = _mm_mul_pd(ra1, rx0);
  46.             ry1 = _mm_add_pd(ry1, ra1);
  47.             ra2 = _mm_mul_pd(ra2, rx0);
  48.             ry2 = _mm_add_pd(ry2, ra2);
  49.             ra3 = _mm_mul_pd(ra3, rx0);
  50.             ry3 = _mm_add_pd(ry3, ra3);
  51.             rx0 = _mm_load_pd(ptr_x + 6);
  52.             ra0 = _mm_load_pd(ptr_a + 6);
  53.             ra1 = _mm_load_pd(ptr_a + n + 6);
  54.             ra2 = _mm_load_pd(ptr_a + 2 * n + 6);
  55.             ra3 = _mm_load_pd(ptr_a + 3 * n + 6);
  56.             ra0 = _mm_mul_pd(ra0, rx0);
  57.             ry0 = _mm_add_pd(ry0, ra0);
  58.             ra1 = _mm_mul_pd(ra1, rx0);
  59.             ry1 = _mm_add_pd(ry1, ra1);
  60.             ra2 = _mm_mul_pd(ra2, rx0);
  61.             ry2 = _mm_add_pd(ry2, ra2);
  62.             ra3 = _mm_mul_pd(ra3, rx0);
  63.             ry3 = _mm_add_pd(ry3, ra3);
  64.         }
  65.  
  66.         ptr_a += 3 * n;
  67.         _mm_store_pd(tmp0, ry0);
  68.         _mm_store_pd(tmp1, ry1);
  69.         _mm_store_pd(tmp2, ry2);
  70.         _mm_store_pd(tmp3, ry3);
  71.         y[i] = tmp0[0] + tmp0[1];
  72.         y[i + 1] = tmp1[0] + tmp1[1];
  73.         y[i + 2] = tmp2[0] + tmp2[1];
  74.         y[i + 3] = tmp3[0] + tmp3[1];
  75.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement