Advertisement
Guest User

Untitled

a guest
Feb 26th, 2015
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.33 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <ctime>
  6.  
  7. #include <x86intrin.h>
  8.  
  9. typedef union
  10. {
  11.     __m128 a;
  12.     float b[4];
  13. } float4;
  14.  
  15. int rand_int(int limit)
  16. {
  17.     return rand() % limit;
  18. }
  19.  
  20. int main(int argc, char *argv[])
  21. {
  22.     if(argc < 2)
  23.     {
  24.         std::cout << "Missing parameter" << std::endl;
  25.         return 1;
  26.     }
  27.    
  28.     if(std::atoi(argv[1]) == 0)
  29.     {
  30.         std::cout << "Invalid parameter" << std::endl;
  31.         return 1;
  32.     }
  33.    
  34.     int vector_size = std::atoi(argv[1]);
  35.    
  36.     // Pad vector to bit width divisible by 128
  37.     vector_size += (vector_size % 4 == 0) ? vector_size : 4 - (vector_size % 4);
  38.    
  39.     float* a = new float[vector_size];
  40.     float* b = new float[vector_size];
  41.     float* r_std = new float[vector_size];
  42.     float* r_sse = new float[vector_size];
  43.    
  44.     srand(time(NULL));
  45.    
  46.     // Fill vectors with random ints
  47.     for(int i = 0; i < vector_size; i++)
  48.     {
  49.         a[i] = rand_int(5);
  50.         b[i] = rand_int(5);
  51.     }
  52.    
  53.     // Print input arrays
  54.     std::cout << "a    : ";
  55.     for(int i = 0; i < vector_size; i++)
  56.     {
  57.         std::cout << a[i] << ", ";
  58.     }
  59.     std::cout << std::endl;
  60.    
  61.     std::cout << "b    : ";
  62.     for(int i = 0; i < vector_size; i++)
  63.     {
  64.         std::cout << b[i] << ", ";
  65.     }
  66.     std::cout << std::endl;
  67.    
  68.     // Add both vectors normal way
  69.     for(int i = 0; i < vector_size; i++)
  70.     {
  71.         r_std[i] = a[i] + b[i];
  72.     }
  73.        
  74.     // Add vectors with sse instructions
  75.     float4 c;
  76.     float4 d;
  77.     float4 r;
  78.     for(int i = 0; i < vector_size; i+=4)
  79.     {
  80.         for(int j = 0; j < 4; j++)
  81.         {
  82.             c.b[j] = a[i+j];
  83.             d.b[j] = b[i+j];
  84.         }
  85.        
  86.         //SSE magic
  87.         r.a = _mm_add_ps(c.a, d.a);
  88.        
  89.         for(int j = 0; j < 4; j++)
  90.         {
  91.             r_sse[i+j] = r.b[j];
  92.         }
  93.     }
  94.    
  95.     std::cout << std::endl;
  96.     std::cout << std::endl;
  97.    
  98.     // Print output arrays
  99.     std::cout << "r_std: ";
  100.     for(int i = 0; i < vector_size; i++)
  101.     {
  102.         std::cout << r_std[i] << ", ";
  103.     }
  104.     std::cout << std::endl;
  105.    
  106.     std::cout << "r_sse: ";
  107.     for(int i = 0; i < vector_size; i++)
  108.     {
  109.         std::cout << r_sse[i] << ", ";
  110.     }
  111.     std::cout << std::endl;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement