Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.13 KB | None | 0 0
  1. #include "workshop.h"
  2. #include <time.h>
  3. #include <string.h>
  4. #include <iostream>
  5.  
  6. int mag = 30;
  7. int tamanio = 3;
  8. double coeficientes[] = {0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25,
  9. 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.25,0.25,0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25};
  10.  
  11. class FIR{
  12. double *coef;
  13. double *samples;
  14. int tam;
  15.  
  16. public:
  17. FIR(int n);
  18. ~FIR();
  19.  
  20. void iniciaCoef(double C[], int n);
  21. double directa( double s);
  22. double directaMM( double s);
  23.  
  24. };
  25.  
  26. FIR::FIR(int n)
  27. {
  28. tam = n;
  29. coef = new double[tam];
  30. samples = new double[tam];
  31.  
  32. }
  33.  
  34. FIR::~FIR()
  35. {
  36. delete coef;
  37. delete samples;
  38. }
  39.  
  40. void FIR::iniciaCoef(double C[], int n)
  41. {
  42. if( tam == n)
  43. {
  44. for (int i =0; i<tam; i++)
  45. {
  46. coef[i] = C[i];
  47. samples[i] = 0.0;
  48. }
  49. }
  50. else
  51. {
  52. delete coef;
  53. delete samples;
  54. tam = n;
  55. coef = new double[tam];
  56. samples = new double[tam];
  57. for (int i =0; i<tam; i++)
  58. {
  59. coef[i] = C[i];
  60. samples[i] = 0.0;
  61. }
  62.  
  63. }
  64.  
  65.  
  66. }
  67.  
  68.  
  69. double FIR::directa(double s)
  70. {
  71. double out = 0.0;
  72. int i;
  73. samples[0] =s;
  74.  
  75. for (i=0; i<tam; i++)
  76. {
  77.  
  78. out += samples[i]*coef[i];
  79. }
  80. for (i = tam-1; i>0 ; i--)
  81. {
  82.  
  83. samples[i] = samples[i-1];
  84. }
  85.  
  86. return out;
  87. }
  88.  
  89. double FIR::directaMM(double s)
  90. {
  91. double out = 0.0;
  92. int i;
  93. samples[0] =s;
  94.  
  95. for (i=0; i<tam; i++)
  96. {
  97. out += samples[i]*coef[i];
  98. }
  99. memmove(samples +1, samples, (tam-1)* sizeof(double));
  100.  
  101. return out;
  102. }
  103.  
  104. int main(int argc, char **argv)
  105. {
  106. const int size = 512;
  107.  
  108. int ciclos = 320000;
  109. srand(time(NULL));
  110. FIR unfiltro(160);
  111. unfiltro.iniciaCoef( coeficientes, 160);
  112.  
  113. auto a = workshop::Array<float>(size);
  114. auto b = workshop::Array<float>(size);
  115. auto c = workshop::Array<float>(size);
  116.  
  117. auto timer = workshop::start_timer();
  118.  
  119. for (int i=0; i<tamanio; i++) {
  120. coeficientes[i] = coeficientes[i] / mag;
  121. }
  122.  
  123. auto duration = workshop::get_duration(timer);
  124.  
  125. timer = workshop::start_timer();
  126.  
  127. #pragma omp simd
  128. for (int i=0; i<tamanio; i++) {
  129. coeficientes[i] = coeficientes[i] / mag;
  130. }
  131.  
  132. auto vector_duration = workshop::get_duration(timer);
  133.  
  134. std::cout << "Loop sin vector " << duration
  135. << " microsegundos para completar." << std::endl;
  136.  
  137. std::cout << "Loop con vector " << vector_duration
  138. << " microsegundos para completar." << std::endl;
  139.  
  140. //Medir tiempo
  141. std::cout<<"Filtro sin vectorizado: ";
  142. auto start = std::chrono::system_clock::now();
  143. for (int i = 0; i<ciclos; i++ )
  144. {
  145. unfiltro.directa(rand());
  146. }
  147. auto fin = std::chrono::system_clock::now();
  148.  
  149. std::chrono::duration<double> elapsed = fin - start;
  150. std::cout << "Elapsed time: " << elapsed.count() << "s"<<std::endl;
  151.  
  152.  
  153. std::cout<<"Filtro CON vectorizado: ";
  154. start = std::chrono::system_clock::now();
  155. for (int i = 0; i<ciclos; i++ )
  156. {
  157. #pragma omp simd
  158. unfiltro.directa(rand());
  159. }
  160. fin = std::chrono::system_clock::now();
  161.  
  162. elapsed = fin - start;
  163. std::cout << "Elapsed time: " << elapsed.count() << "s";
  164. std::cout<<std::endl<<"__________________________"<<std::endl;
  165.  
  166. return 0;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement