avx_matrix.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "avx_matrix.hpp"
  2. //------------------
  3. // AvxMatrix::clear
  4. //------------------
  5. void
  6. AvxMatrix::clear(){
  7. for(size_t i=0;i<avx_size;++i) avx[i]=zeros;
  8. }
  9. //--------------------
  10. // AvxMatrix::display
  11. //--------------------
  12. void
  13. AvxMatrix::display(size_t nl,size_t nc) const{
  14. for(size_t i=0;i<nl;++i){
  15. for(size_t j=0;j<nc;++j){
  16. cout<<get(i,j)<<'\t';
  17. }
  18. cout<<endl;
  19. }
  20. }
  21. //--------------------------------
  22. // AvxMatrix::get_diag_square_sym
  23. //--------------------------------
  24. Reel
  25. AvxMatrix::get_diag_square_sym(size_t i,size_t n) const{
  26. size_t n_avx=(n-1)/4+1;
  27. Block b;
  28. b.avx=zeros;
  29. for(size_t k=0;k<n_avx;++k){
  30. __m256d a=avx[i*avx_rank+k];
  31. b.avx=_mm256_fmadd_pd(a,a,b.avx);
  32. }
  33. return b.data[0]+b.data[1]+b.data[2]+b.data[3];
  34. }
  35. //---------------------
  36. // AvxMatrix::from_C_B
  37. //---------------------
  38. void
  39. AvxMatrix::from_C_B(const AvxMatrix& C,const AvxMatrix& B,size_t n){
  40. size_t n_avx=(n-1)/4+1;
  41. Block c;
  42. for(size_t i=0;i<n;++i){
  43. for(size_t j=0;j<n;++j){
  44. c.avx=zeros;
  45. for(size_t k=0;k<n_avx;++k){
  46. __m256d a=C.avx[i*avx_rank+k];
  47. __m256d b=B.avx[j*avx_rank+k];
  48. c.avx=_mm256_fmadd_pd(a,b,c.avx);
  49. }
  50. get(i,j)=(0.25)*(c.data[0]+c.data[1]+c.data[2]+c.data[3]);
  51. }
  52. get(i,i)+=1;
  53. get(i,n)=1;
  54. }
  55. }
  56. //-----------------------
  57. // AvxMatrix::swap_lines
  58. //-----------------------
  59. void
  60. AvxMatrix::swap_lines(size_t i,size_t j,size_t navx){
  61. size_t ind_i=i*avx_rank;
  62. size_t ind_j=j*avx_rank;
  63. for(size_t k=0;k<navx;++k){
  64. __m256d a=avx[ind_i];
  65. avx[ind_i]=avx[ind_j];
  66. avx[ind_j]=a;
  67. ++ind_i;
  68. ++ind_j;
  69. }
  70. }
  71. //---------------------
  72. // AvxMatrix::mul_line
  73. //---------------------
  74. void
  75. AvxMatrix::mul_line(size_t i,Reel a,size_t navx){
  76. __m256d b=_mm256_set1_pd(a);
  77. size_t ind_i=i*avx_rank;
  78. for(size_t k=0;k<navx;++k){
  79. avx[ind_i]=_mm256_mul_pd(avx[ind_i],b);
  80. ++ind_i;
  81. }
  82. }
  83. //-------------------------
  84. // AvxMatrix::add_mul_line
  85. //-------------------------
  86. void
  87. AvxMatrix::add_mul_line(size_t i,size_t j,Reel a,size_t navx){
  88. __m256d b=_mm256_set1_pd(a);
  89. size_t ind_i=i*avx_rank;
  90. size_t ind_j=j*avx_rank;
  91. for(size_t k=0;k<navx;++k){
  92. avx[ind_i]=_mm256_fmadd_pd(avx[ind_j],b,avx[ind_i]);
  93. ++ind_i;
  94. ++ind_j;
  95. }
  96. }
  97. //------------------
  98. // AvxMatrix::Gauss
  99. //------------------
  100. Reel
  101. AvxMatrix::Gauss(size_t nl,size_t nc){
  102. size_t navx=(nc-1)/4+1;
  103. Reel det=1;
  104. size_t np=0; //np=0
  105. for(size_t j=0;j<nc;++j){
  106. for(size_t p=np;p<nl;++p){
  107. Reel c=get(p,j);
  108. if(c!=0){
  109. det*=c;
  110. mul_line(p,1.0/c,navx);
  111. for(size_t k=0;k<nl;++k){
  112. if(k!=p){
  113. add_mul_line(k,p,-get(k,j),navx);
  114. }
  115. }
  116. if(p!=np){
  117. swap_lines(np,p,navx);
  118. det*=-1;
  119. }
  120. ++np;
  121. break;
  122. }
  123. }
  124. }
  125. return det;
  126. }