Guest User

Khai Nguyen Question

a guest
Jul 31st, 2015
440
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.32 KB | None | 0 0
  1. #include <emmintrin.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5.  
  6. #define NEAR 10
  7. #define T1 100
  8. #define T2 1000
  9. #define T3 10000
  10.  
  11. int func(int Di) {
  12.   if (Di <= -T3) return  -4;
  13.   if (Di <= -T2) return  -3;
  14.   if (Di <= -T1) return  -2;
  15.   if (Di < -NEAR)  return  -1;
  16.   if (Di <= NEAR) return   0;
  17.   if (Di < T1)   return   1;
  18.   if (Di < T2)   return   2;
  19.   if (Di < T3)   return   3;
  20.   return  4;
  21. }
  22.  
  23. __m128i func4(__m128i D) {
  24.   __m128i cmp_m3 = _mm_cmpgt_epi32(D, _mm_set1_epi32(-T3));
  25.   __m128i cmp_m2 = _mm_cmpgt_epi32(D, _mm_set1_epi32(-T2));
  26.   __m128i cmp_m1 = _mm_cmpgt_epi32(D, _mm_set1_epi32(-T1));
  27.   __m128i cmp_p0 = _mm_cmpgt_epi32(D, _mm_set1_epi32(NEAR));
  28.   __m128i reduce_true = _mm_add_epi32(_mm_add_epi32(cmp_m3, cmp_m2), _mm_add_epi32(cmp_m1, cmp_p0));
  29.   __m128i cmp_m0 = _mm_cmplt_epi32(D, _mm_set1_epi32(-NEAR));
  30.   __m128i cmp_p1 = _mm_cmplt_epi32(D, _mm_set1_epi32(T1));
  31.   __m128i cmp_p2 = _mm_cmplt_epi32(D, _mm_set1_epi32(T2));
  32.   __m128i cmp_p3 = _mm_cmplt_epi32(D, _mm_set1_epi32(T3));
  33.   __m128i reduce_false = _mm_add_epi32(_mm_add_epi32(cmp_p3, cmp_p2), _mm_add_epi32(cmp_p1, cmp_m0));
  34.   return _mm_sub_epi32(reduce_false, reduce_true);
  35. }
  36.  
  37. const int COUNT = 16<<10;
  38.  
  39. static union {
  40.   int data_i[4 * COUNT];
  41.   __m128i data_r[COUNT];
  42. };
  43.  
  44. static union {
  45.   int res_i[4];
  46.   __m128i res_r;
  47. };
  48.  
  49. int main() {
  50.   for (int i = 0; i < 4*COUNT; i++)
  51.     data_i[i] = rand() - 16768;
  52.  
  53.   for (int i = 0; i < COUNT; i++) {
  54.     int corr[4];
  55.     for (int j = 0; j < 4; j++)
  56.       corr[j] = func(data_i[4*i+j]);
  57.     res_r = func4(data_r[i]);
  58.     for (int j = 0; j < 4; j++)
  59.       if (corr[j] != res_i[j])
  60.         printf("Wrong!");
  61.   }
  62.  
  63.   {
  64.     int start = clock();
  65.     int sum = 0;
  66.     for (int q = 0; q < 10000; q++) {
  67.       for (int i = 0; i < 4*COUNT; i++)
  68.         sum += func(data_i[i]);
  69.     }
  70.     printf("Time = %0.3lf   (%d)\n", double(clock() - start) / CLOCKS_PER_SEC, sum);
  71.   }
  72.  
  73.   {
  74.     int start = clock();
  75.     __m128i sum = _mm_setzero_si128();
  76.     for (int q = 0; q < 10000; q++) {
  77.       for (int i = 0; i < COUNT; i++)
  78.         sum = _mm_add_epi32(sum, func4(data_r[i]));
  79.     }
  80.     res_r = sum;
  81.     int rsum = res_i[0] + res_i[1] + res_i[2] + res_i[3];
  82.     printf("Time = %0.3lf   (%d)\n", double(clock() - start) / CLOCKS_PER_SEC, rsum);
  83.   }
  84.  
  85.   return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment