matrix.hpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #ifndef MATRIX_HPP
  2. #define MATRIX_HPP
  3. #include <iostream>
  4. #include <immintrin.h>
  5. using namespace std;
  6. class Matrix{
  7. protected:
  8. size_t nr,nc,nc_avx,nc_full;
  9. double* data;
  10. public:
  11. Matrix();
  12. void init(size_t n);
  13. void init(size_t nrow,size_t ncol);
  14. double get(size_t i,size_t j) const;
  15. double& get(size_t i,size_t j);
  16. void clear();
  17. void display() const;
  18. __m256d* get_avx_row(size_t i);
  19. const __m256d* get_avx_row(size_t i) const;
  20. void swap_lines(size_t i,size_t j);
  21. void mul_line(size_t i,double a);
  22. void add_mul_line(size_t i,size_t j,double a);
  23. double get_diag_square_sym(size_t i) const;
  24. double Gauss();
  25. };
  26. //*****************
  27. //* AVX constants *
  28. //*****************
  29. //! Array of 4 zeros
  30. static const __m256d zeros=_mm256_set1_pd(0);
  31. //*************
  32. //* Avx block *
  33. //*************
  34. //! Block structure mixing representing m256 as array of 4 doubles
  35. union AvxBlock{
  36. __m256d avx;
  37. double data[4];
  38. };
  39. //******************
  40. //* Inline methods *
  41. //******************
  42. inline
  43. Matrix::Matrix(){
  44. nr=0;
  45. nc=0;
  46. nc_avx=0;
  47. nc_full=0;
  48. data=nullptr;
  49. }
  50. inline void
  51. Matrix::init(size_t n){
  52. return init(n,n);
  53. }
  54. inline double
  55. Matrix::get(size_t i,size_t j) const{
  56. return data[i*nc_full+j];
  57. }
  58. inline double&
  59. Matrix::get(size_t i,size_t j){
  60. return data[i*nc_full+j];
  61. }
  62. inline __m256d*
  63. Matrix::get_avx_row(size_t r){
  64. return (__m256d*)(&data[r*nc_full]);
  65. }
  66. inline const __m256d*
  67. Matrix::get_avx_row(size_t r) const{
  68. return (__m256d*)(&data[r*nc_full]);
  69. }
  70. #endif