Advertisement
Guest User

Untitled

a guest
Nov 18th, 2016
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.85 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <omp.h>
  4. #include <stdint.h>
  5. #include <cstdlib>
  6. #include <algorithm>
  7. #include <ctime>
  8. #include <chrono>
  9. #include <fstream>
  10. #include <iostream>
  11.  
  12.  
  13. uint64_t n = 30000000;
  14. uint64_t c = 15;
  15. uint64_t m = 60;
  16. uint64_t N = 1;
  17. uint64_t proc_num = 4;
  18.  
  19. using namespace std;
  20.  
  21. vector< vector<double> > U(n);
  22. vector< vector<double> > C(c);
  23. vector< vector<uint8_t> > M(n);
  24.  
  25. static inline uint64_t rdtsc(void) {
  26.     union {
  27.         uint64_t tsc_64;
  28.         struct {
  29.             uint32_t lo_32;
  30.             uint32_t hi_32;
  31.         };
  32.     } tsc;
  33.  
  34.     asm volatile("rdtsc" :
  35.                     "=a" (tsc.lo_32),
  36.                     "=d" (tsc.hi_32));
  37.     return tsc.tsc_64;
  38. }      
  39.  
  40. void initZerosDoubles(vector< vector<double> > &V, int size_1, int size_2)
  41. {
  42.     for (uint64_t i=0; i < size_1; ++i)
  43.     {
  44.         V[i] = vector<double>(size_2, 0.0);
  45.     }
  46. }
  47.  
  48. void initZerosInt8(vector< vector<uint8_t> > &V, int size_1, int size_2)
  49. {
  50.     for (uint64_t i=0; i < size_1; ++i)
  51.     {
  52.         V[i] = vector<uint8_t>(size_2, 0.0);
  53.     }
  54. }
  55.  
  56. double f(double fMin, double fMax)
  57. {
  58.     double res = (double)rand() / RAND_MAX;
  59.     return fMin + res * (fMax - fMin);
  60. }
  61. double fRand()
  62. {
  63.     return f(0, 1);
  64. }
  65.  
  66. void generateMatrix()
  67. {
  68.     for (uint64_t i=0; i < U.size(); ++i)
  69.     {
  70.         vector<double> v(m);
  71.         generate(v.begin(), v.end(), fRand);
  72.  
  73.         U[i] = v;
  74.     }
  75.          
  76. }
  77.  
  78. void generateCenter()
  79. {
  80.     vector<uint64_t> v(U.size());
  81.     iota(v.begin(), v.end(), 0);
  82.     random_shuffle(v.begin(), v.end());
  83.     for(uint64_t i=0; i < c; ++i)
  84.     {
  85.         C[i] = U[v[i]];
  86.     }
  87. }
  88.  
  89. double l2_norm(vector<double> const& u1, vector<double> const& u2, int size)
  90. {
  91.     double accum = 0.;
  92.     for (uint64_t i=0; i < size; ++i)
  93.     {
  94.         accum += (u2[i] - u1[i]) * (u2[i] - u1[i]);
  95.     }
  96.  
  97.     return accum;
  98. }
  99.  
  100. void sum(vector<double> & u1, vector<double> const& u2, int size)
  101. {
  102.     for (uint64_t i=0; i < size; ++i)
  103.     {
  104.         u1[i] += u2[i];
  105.     }
  106. }
  107.  
  108. double mainCycle()
  109. {
  110.  
  111.     double J;
  112.     cout << "Starting.." << endl;
  113.     auto start_ts = chrono::steady_clock::now();
  114.     for (int numCycles=0; numCycles < N; ++numCycles)
  115.     {
  116.         J = 0;
  117.         initZerosInt8(M, n, c);
  118.         vector< vector<double> > C_new[proc_num];
  119.         vector<uint64_t> c_newCount[proc_num];
  120.         for (uint64_t i=0; i < proc_num; ++i)
  121.         {
  122.             C_new[i] = vector< vector<double> >(c);
  123.             initZerosDoubles(C_new[i], c, m);
  124.             c_newCount[i] = vector<uint64_t>(c, 0);
  125.         }
  126.  
  127.         start_ts = chrono::steady_clock::now();
  128.         #pragma omp parallel for num_threads(proc_num)
  129.         for (uint64_t i=0; i < n; ++i)
  130.         {
  131.             double d_min = l2_norm(U[i], C[0], m);
  132.             uint64_t j_min = 0;
  133.             for (uint64_t j=0; j < c; ++j)
  134.             {
  135.                 double d = l2_norm(U[i], C[j], m);
  136.                 if (d < d_min)
  137.                 {
  138.                     d_min = d;
  139.                     j_min = j;
  140.                 }
  141.                
  142.             }
  143.             J += d_min;
  144.             M[i][j_min] = 1;
  145.            
  146.             sum(C_new[i % proc_num][j_min], U[i], m);
  147.             c_newCount[i % proc_num][j_min] += 1;
  148.         }
  149.  
  150.         for (uint64_t i=0; i < c; ++i)
  151.         {
  152.             for (uint64_t j=0; j < m; ++j)
  153.             {
  154.                 double c_new = 0;
  155.                 uint64_t c_new_count = 0;
  156.                 for (uint64_t p=0; p < proc_num; ++p)
  157.                 {
  158.                     c_new += C_new[p][i][j];
  159.                     c_new_count += c_newCount[p][i];
  160.                 }
  161.                 C[i][j] = c_new / c_new_count;
  162.             }
  163.         }
  164.    
  165.     }
  166.     auto finish_ts = chrono::steady_clock::now();
  167.     auto duration_ts = chrono::duration<double> (finish_ts - start_ts).count();
  168.    //for (uint64_t i=0; i < c; ++i)
  169.    //{
  170.    //    for (uint64_t j=0; j < m; ++j)
  171.    //    {
  172.    //        cout << C[i][j] << " ";
  173.    //    }
  174.    //    cout << endl;
  175.    //}
  176.    
  177.    
  178.     double flops = 3*n*(m*c+1) / duration_ts  / 1000000000.0;
  179.     cout << "n_obj: " << n << ", n_class: " << c << ", n_feat: " << m << ", n_proc: " << proc_num << ", n_feat: " << duration_ts << " s, GFLOPS: " << flops  << endl;
  180.  
  181.     return flops;
  182. }
  183.  
  184. int main()
  185. {
  186.     std::srand(unsigned(std::time(0)));
  187.     generateMatrix();
  188.    
  189.    
  190.     ofstream outfile;
  191.     outfile.open("res.txt", ios::out | ios::trunc );
  192.     outfile << "n= " << n << ", c= " << c << endl;
  193.    
  194.     double cur_flops;
  195.    
  196.     for (proc_num = 1; proc_num <= 48; proc_num +=2)
  197.     {
  198.         for (m = 2; m <= 60; m+=4)
  199.         {        
  200.             generateCenter();
  201.             cur_flops = mainCycle();
  202.             //m << ", " << proc_num << ", " << duration_ts << ", " << cur_flops << endl;
  203.             outfile << cur_flops << ", ";
  204.         }
  205.         outfile << endl;
  206.     }
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement