fork download
  1. #include <iostream>
  2. #include <cstdlib> // rand
  3. #include <ctime> // time
  4. #include <sys/time.h> // gettimeofday
  5.  
  6. class Timer
  7. {
  8. private:
  9. timeval t1, t2;
  10. public:
  11. Timer() {}
  12. ~Timer() {}
  13. void start() { gettimeofday(&t1, NULL); }
  14. void stop() { gettimeofday(&t2, NULL); }
  15. double elapsedTime() { return (t2.tv_sec - t1.tv_sec)*1000.0 + (t2.tv_usec - t1.tv_usec)/1000; }
  16. };
  17.  
  18. template<typename T>
  19. class Vector
  20. {
  21. private:
  22. T *data;
  23. const size_t num;
  24. public:
  25. Vector(const size_t num) : num(num) { data = new T[num]; }
  26. ~Vector() { delete[] data; }
  27. inline T& operator() (const size_t i) { return data[i]; }
  28. inline const T& operator() (const size_t i) const { return data[i]; }
  29. size_t size() const { return num; }
  30. };
  31.  
  32. template<typename T>
  33. class Matrix
  34. {
  35. private:
  36. T *data;
  37. const size_t nrows, ncols;
  38. public:
  39. Matrix(const size_t nr, const size_t nc) : nrows(nr), ncols(nc) { data = new T[nrows * ncols]; }
  40. ~Matrix() { delete[] data; }
  41. inline T& operator() (const size_t r, const size_t c) { return data[c*nrows + r]; }
  42. inline const T& operator() (const size_t r, const size_t c) const { return data[c*nrows + r]; }
  43. size_t size1() const { return nrows; }
  44. size_t size2() const { return ncols; }
  45. };
  46.  
  47. inline double rand_double(double min=0.0, double max=1.0)
  48. {
  49. return (max - min) * (static_cast<double>(rand()) / RAND_MAX) + min;
  50. }
  51.  
  52. int main() {
  53. // seed random number generator
  54. srand( static_cast<unsigned int>(time(NULL)) );
  55.  
  56. // intialize data
  57. const int m = 1000, n = 40000;
  58. Matrix<double> A(m,n);
  59. Vector<double> B(m);
  60. for(size_t i=0; i<A.size1(); i++) {
  61. B(i) = rand_double();
  62. for(size_t j=0; j<A.size2(); j++) {
  63. A(i,j) = rand_double();
  64. }
  65. }
  66.  
  67. // measure timing
  68. Timer timer;
  69. timer.start();
  70.  
  71. // in MATLAB: count = sum(bsxfun(@ne, A, B))
  72. Vector<double> count(n);
  73. #pragma omp parallel for
  74. for(int j=0; j<n; ++j) {
  75. count(j) = 0.0;
  76. for(int i=0; i<m; i++) {
  77. count(j) += (A(i,j) != B(i));
  78. }
  79. }
  80.  
  81. timer.stop();
  82.  
  83. // elapsed time in milliseconds
  84. std::cout << "Elapsed time is " << timer.elapsedTime() << " milliseconds." << std::endl;
  85.  
  86. return 0;
  87. }
  88.  
Success #stdin #stdout 4.64s 3432KB
stdin
Standard input is empty
stdout
Elapsed time is 258 milliseconds.