Show
Ignore:
Timestamp:
08/28/07 09:37:54 (1 year ago)
Author:
pernet
Message:

New implementation for ftrsm and ftrmm:
based on the multicascade algorithm (cf C Pernet pdf thesis), reducing the number of modular reduction for the updates.
Automatic generation of the code for each of the 48 variations.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • include/fflas-ffpack/fflas_ftrsm.inl

    r36 r38  
    1414// Computes  B <- alpha.op(A^-1).B,  B <- alpha.B.op(A^-1) 
    1515// B is M*N, A is M*M if Side==FflasLeft, N*N if Side==FflasRight 
     16// Warning : unsafe with Trans ==  FflasTrans (debugging in progress) 
    1617//--------------------------------------------------------------------- 
    1718template<class Field> 
     
    678679#undef __FFLAS__TRANSPOSE 
    679680#undef __FFLAS__UNIT 
    680  
    681 //  
    682 // template<class Field> 
    683 // inline void  
    684 // FFLAS::ftrsmLeftUpNoTrans(const Field& F, const FFLAS_DIAG Diag,  
    685 //                        const size_t M, const size_t N, 
    686 //                        const typename Field::Element alpha, 
    687 //                        const typename Field::Element * A, const size_t lda, 
    688 //                        typename Field::Element * B, const size_t ldb){ 
    689 //      static typename Field::Element Mone; 
    690 //      static typename Field::Element one; 
    691 //      F.init(Mone, -1.0); 
    692 //      F.init(one, 1.0); 
    693 //      if ( M==1 ){ 
    694 //              if (Diag == FflasNonUnit ){ 
    695 //                      typename Field::Element inv; 
    696 //                      F.inv(inv, *A); 
    697 //                      fscal(F, N, inv, B, 1); 
    698 //              } 
    699 //      } 
    700 //      else{ 
    701 //              size_t Mup=M>>1; 
    702 //              size_t Mdown = M-Mup; 
    703 //              ftrsmLeftUpNoTrans( F, Diag, Mdown, N, alpha,  
    704 //                                  A+Mup*(lda+1), lda, B+Mup*ldb, ldb); 
    705 //              fgemm( F, FflasNoTrans, FflasNoTrans, Mup, N, Mdown, Mone, 
    706 //                     A+Mup, lda, B+Mup*ldb, ldb, alpha, B, ldb); 
    707 //              ftrsmLeftUpNoTrans( F, Diag, Mup, N, one, A, lda, B, ldb); 
    708 //      } 
    709  
    710 // } 
    711  
    712 // template<class Field> 
    713 // inline void 
    714 // FFLAS::ftrsmLeftUpTrans(const Field& F, const FFLAS_DIAG Diag,  
    715 //                    const size_t M, const size_t N, 
    716 //                    const typename Field::Element alpha, 
    717 //                    const typename Field::Element * A, const size_t lda, 
    718 //                    typename Field::Element * B, const size_t ldb){ 
    719  
    720 //      static typename Field::Element Mone; 
    721 //      static typename Field::Element one; 
    722 //      F.init(Mone, -1.0); 
    723 //      F.init(one, 1.0); 
    724 //      if ( M==1 ){ 
    725 //              if (Diag == FflasNonUnit ){ 
    726 //                      typename Field::Element inv; 
    727 //                      F.inv(inv, *A); 
    728 //                      fscal(F, N, inv, B, 1); 
    729 //              } 
    730 //      } 
    731 //      else{ 
    732 //              size_t Mup=M>>1; 
    733 //              size_t Mdown = M-Mup; 
    734 //              ftrsmLeftUpTrans( F, Diag, Mdown, N, alpha,  
    735 //                                A+Mup*(lda+1), lda, B+Mup*ldb, ldb); 
    736 //              fgemm( F, FflasTrans, FflasNoTrans, Mup, N, Mdown, Mone,  
    737 //                     A+Mup*lda, lda, B+Mup*ldb, ldb, alpha, B, ldb); 
    738 //              ftrsmLeftUpTrans( F, Diag, Mup, N, one, A, lda, B, ldb); 
    739 //      } 
    740 // } 
    741  
    742 // template<class Field> 
    743 // inline void 
    744 // FFLAS::ftrsmLeftLowNoTrans(const Field& F, const FFLAS_DIAG Diag,  
    745 //                         const size_t M, const size_t N, 
    746 //                         const typename Field::Element alpha, 
    747 //                         typename Field::Element * A, const size_t lda, 
    748 //                         typename Field::Element * B, const size_t ldb, const size_t nmax){ 
    749  
    750 //      callFtrsmLeftLowNoTrans<typename Field::Element>() (F,Diag,M,N,alpha,A,lda,B,ldb,nmax); 
    751 // } 
    752  
    753  
    754  
    755 //      // Implementation of Ftrsmleftlownotrans on a Field with a 
    756 //      // double floating point representation 
    757 // template<> 
    758 // class FFLAS::callFtrsmLeftLowNoTrans<double>{ 
    759 // public: 
    760 //      template <class Field> 
    761 //      void operator ()(const Field& F, const FFLAS_DIAG Diag,  
    762 //                       const size_t M, const size_t N, 
    763 //                       const typename Field::Element alpha, 
    764 //                       typename Field::Element * A, const size_t lda, 
    765 //                       typename Field::Element * B, const size_t ldb, const size_t nmax){ 
    766                  
    767 //              static typename Field::Element Mone; 
    768 //              static typename Field::Element one; 
    769 //              F.init(one, 1.0); 
    770 //              F.neg(Mone, one); 
    771                  
    772 //              if ( M <= nmax ){  
    773 //                      typename Field::Element inv; 
    774 //                      if (Diag == FflasNonUnit ){ 
    775 //                              //Normalization of A and correction of B 
    776 //                              typename Field::Element * Ai = A; 
    777 //                              typename Field::Element * Bi = B; 
    778 //                              for (size_t i=0; i<M; ++i){ 
    779 //                                      F.inv( inv, *(Ai+i) ); 
    780 //                                      fscal(F, i, inv, Ai, 1 ); 
    781 //                                      fscal(F, N, inv, Bi, 1 ); 
    782 //                                      Ai += lda; Bi+=ldb; 
    783                                          
    784 //                              } 
    785 //                      } 
    786                          
    787 //                      cblas_dtrsm(  CblasRowMajor, CblasLeft, CblasLower, CblasNoTrans, 
    788 //                                    CblasUnit, M, N, one, A, lda, B, ldb ); 
    789 //                      for (size_t i=0; i< M; ++i) 
    790 //                              for (size_t j=0; j<N; ++j) 
    791 //                                      F.init(*(B+i*ldb+j),*(B+i*ldb+j)); 
    792                                          
    793                          
    794 //                      if (Diag == FflasNonUnit ){ 
    795 //                              //Denormalization of A 
    796 //                              typename Field::Element *  Ai=A; 
    797 //                              for (size_t i=0; i<M; ++i){ 
    798 //                                      fscal( F, i, *(Ai+i), Ai, 1 ); 
    799 //                                      Ai += lda; 
    800 //                              } 
    801 //                      } 
    802 //              } 
    803 //              else{ 
    804 //                      size_t Mup=M>>1; 
    805 //                      size_t Mdown = M-Mup; 
    806 //                      this->operator()( F, Diag, Mup, N, alpha, A, lda, B, ldb, nmax); 
    807 //                      fgemm( F, FflasNoTrans, FflasNoTrans, Mdown, N, Mup, 
    808 //                             Mone, A+Mup*lda, lda, B, ldb, alpha, B+Mup*ldb, ldb); 
    809 //                      this->operator()( F, Diag, Mdown, N, one,  
    810 //                                        A+Mup*(lda+1), lda, B+Mup*ldb, ldb, nmax); 
    811 //              } 
    812                  
    813 //      } 
    814 // }; 
    815  
    816 // template<> 
    817 // class FFLAS::callFtrsmLeftLowNoTrans<float>{ 
    818 // public: 
    819 //      template <class Field> 
    820 //      void operator ()(const Field& F, const FFLAS_DIAG Diag,  
    821 //                       const size_t M, const size_t N, 
    822 //                       const typename Field::Element alpha, 
    823 //                       typename Field::Element * A, const size_t lda, 
    824 //                       typename Field::Element * B, const size_t ldb, const size_t nmax){ 
    825                  
    826 //              static typename Field::Element Mone; 
    827 //              static typename Field::Element one; 
    828 //              F.init(one, 1.0); 
    829 //              F.neg(Mone, one); 
    830                  
    831 //              if ( M <= nmax ){  
    832 //                      typename Field::Element inv; 
    833 //                      if (Diag == FflasNonUnit ){ 
    834 //                              //Normalization of A and correction of B 
    835 //                              typename Field::Element * Ai = A; 
    836 //                              typename Field::Element * Bi = B; 
    837 //                              for (size_t i=0; i<M; ++i){ 
    838 //                                      F.inv( inv, *(Ai+i) ); 
    839 //                                      fscal(F, i, inv, Ai, 1 ); 
    840 //                                      fscal(F, N, inv, Bi, 1 ); 
    841 //                                      Ai += lda; Bi+=ldb; 
    842                                          
    843 //                              } 
    844 //                      } 
    845                          
    846 //                      cblas_strsm(  CblasRowMajor, CblasLeft, CblasLower, CblasNoTrans, 
    847 //                                    CblasUnit, M, N, alpha, A, lda, B, ldb ); 
    848 //                      for (size_t i=0; i< M; ++i) 
    849 //                              for (size_t j=0; j<N; ++j) 
    850 //                                      F.init(*(B+i*ldb+j),*(B+i*ldb+j)); 
    851                          
    852 //                      if (Diag == FflasNonUnit ){ 
    853 //                              //Denormalization of A 
    854 //                              typename Field::Element *  Ai=A; 
    855 //                              for (size_t i=0; i<M; ++i){ 
    856 //                                      fscal( F, i, *(Ai+i), Ai, 1 ); 
    857 //                                      Ai += lda; 
    858 //                              } 
    859 //                      } 
    860 //              } 
    861 //              else{ 
    862 //                      size_t Mup=M>>1; 
    863 //                      size_t Mdown = M-Mup; 
    864 //                      this->operator()( F, Diag, Mup, N, alpha, A, lda, B, ldb, nmax); 
    865 //                      fgemm( F, FflasNoTrans, FflasNoTrans, Mdown, N, Mup, 
    866 //                             Mone, A+Mup*lda, lda, B, ldb, alpha, B+Mup*ldb, ldb); 
    867 //                      this->operator()( F, Diag, Mdown, N, one,  
    868 //                                        A+Mup*(lda+1), lda, B+Mup*ldb, ldb, nmax); 
    869 //              } 
    870                  
    871 //      } 
    872 // }; 
    873  
    874 // template<class Element> 
    875 // class FFLAS::callFtrsmLeftLowNoTrans{ 
    876 // public: 
    877 //      template <class Field> 
    878 //      void operator()(const Field& F, const FFLAS_DIAG Diag,  
    879 //                      const size_t M, const size_t N, 
    880 //                      const typename Field::Element alpha, 
    881 //                      typename Field::Element * A, const size_t lda, 
    882 //                      typename Field::Element * B, const size_t ldb, const size_t nmax){ 
    883                  
    884 //              static typename Field::Element Mone; 
    885 //              static typename Field::Element one; 
    886 //              F.init(Mone, -1.0); 
    887 //              F.init(one, 1.0); 
    888 //              if ( M <= nmax ){ 
    889 //                      typename Field::Element inv; 
    890 //                      if (Diag == FflasNonUnit ){ 
    891 //                              //Normalization of A and correction of B 
    892 //                              // A<-DA, B<-DB 
    893 //                              typename Field::Element * Ai = A; 
    894 //                              typename Field::Element * Bi = B; 
    895 //                              for (size_t i=0; i<M; ++i){ 
    896 //                                      F.inv( inv, *(Ai+i) ); 
    897 //                                      fscal(F, i, inv, Ai, 1 ); 
    898 //                                      fscal(F, N, inv, Bi, 1 ); 
    899 //                                      Ai += lda; Bi+=ldb; 
    900 //                              } 
    901 //                      } 
    902 //                      double alphad; 
    903 //                      if (F.areEqual(alpha, Mone)) 
    904 //                              alphad = -1.0; 
    905 //                      else 
    906 //                              F.convert( alphad, alpha ); 
    907 //                      DoubleDomain::Element * Ad = new DoubleDomain::Element[M*M]; 
    908 //                      DoubleDomain::Element * Bd = new DoubleDomain::Element[M*N]; 
    909 //                      MatF2MatD( F, Ad, N, A, lda, M, M ); 
    910 //                      MatF2MatD( F, Bd, N, B, ldb, M, N ); 
    911 //                      cblas_dtrsm(  CblasRowMajor, CblasLeft, CblasLower, CblasNoTrans, 
    912 //                                    CblasUnit, M, N, alphad, Ad, M, Bd, N ); 
    913 //                      delete[] Ad; 
    914 //                      MatD2MatF( F, B, ldb, Bd, N, M, N ); 
    915 //                      delete[] Bd; 
    916 //                      if (Diag == FflasNonUnit ){ 
    917 //                              //Denormalization of A 
    918 //                              // A-> D^(-1)A 
    919 //                              typename Field::Element *  Ai=A; 
    920 //                              for (size_t i=0; i<M; ++i){ 
    921 //                                      fscal( F, i, *(Ai+i), Ai, 1 ); 
    922 //                                      Ai += lda; 
    923 //                              } 
    924 //                      } 
    925 //              } 
    926 //              else{ 
    927 //                      size_t Mup=M>>1; 
    928 //                      size_t Mdown = M-Mup; 
    929 //                      this->operator()( F, Diag, Mup, N, alpha, A, lda, B, ldb, nmax); 
    930 //                      fgemm( F, FflasNoTrans, FflasNoTrans, Mdown, N, Mup, 
    931 //                             Mone, A+Mup*lda, lda, B, ldb, alpha, B+Mup*ldb, ldb); 
    932 //                      this->operator()( F, Diag, Mdown, N, one,  
    933 //                                        A+Mup*(lda+1), lda, B+Mup*ldb, ldb, nmax); 
    934 //              } 
    935 //      } 
    936 // }; 
    937  
    938  
    939 // template<class Field> 
    940 // inline void  
    941 // FFLAS::ftrsmLeftLowTrans(const Field& F, const FFLAS_DIAG Diag,  
    942 //                     const size_t M, const size_t N, 
    943 //                     const typename Field::Element alpha, 
    944 //                     const typename Field::Element * A, const size_t lda, 
    945 //                     typename Field::Element * B, const size_t ldb){ 
    946  
    947 //      static typename Field::Element Mone; 
    948 //      static typename Field::Element one; 
    949 //      F.init(Mone, -1.0); 
    950 //      F.init(one, 1.0); 
    951 //      if ( M==1 ){ 
    952 //              if (Diag == FflasNonUnit ){ 
    953 //                      typename Field::Element inv; 
    954 //                      F.inv(inv, *A); 
    955 //                      fscal(F, N, inv, B, 1); 
    956 //              } 
    957 //      } 
    958 //      else{ 
    959 //              size_t Mup=M>>1; 
    960 //              size_t Mdown = M-Mup; 
    961 //              ftrsmLeftLowTrans( F, Diag, Mup, N, alpha, A, lda, B, ldb); 
    962 //              fgemm( F, FflasTrans, FflasNoTrans, Mdown, N, Mup, 
    963 //                     Mone, A+Mup, lda, B, ldb, alpha, B+Mup*ldb, ldb); 
    964 //              ftrsmLeftLowTrans( F, Diag, Mdown, N, one,  
    965 //                                 A+Mup*(lda+1), lda, B+Mup*ldb, ldb); 
    966 //      } 
    967 // } 
    968  
    969  
    970 // template<class Field> 
    971 // inline void 
    972 // FFLAS::ftrsmRightUpNoTrans(const Field& F, const FFLAS_DIAG Diag,  
    973 //                         const size_t M, const size_t N, 
    974 //                         const typename Field::Element alpha, 
    975 //                         typename Field::Element * A, const size_t lda, 
    976 //                         typename Field::Element * B, const size_t ldb, const size_t nmax){ 
    977  
    978 //      callFtrsmRightUpNoTrans<typename Field::Element>() (F,Diag,M,N,alpha,A,lda,B,ldb,nmax); 
    979 // } 
    980  
    981 // template <class Element> 
    982 // class FFLAS::callFtrsmRightUpNoTrans{ 
    983 // public: 
    984 //      template<class Field> 
    985 //      void operator() (const Field& F, const FFLAS_DIAG Diag,  
    986 //                       const size_t M, const size_t N, 
    987 //                       const typename Field::Element alpha, 
    988 //                       typename Field::Element * A, const size_t lda, 
    989 //                       typename Field::Element * B, const size_t ldb, const size_t nmax){ 
    990          
    991 //              static typename Field::Element Mone; 
    992 //              static typename Field::Element one; 
    993 //              F.init(Mone, -1.0); 
    994 //              F.init(one, 1.0); 
    995                  
    996 //              if ( N <= nmax ){ 
    997 //                      typename Field::Element inv; 
    998 //                      if (Diag == FflasNonUnit){ 
    999 //                              //Normalization of A and B 
    1000 //                              typename Field::Element *  Ai = A, * Bi = B; 
    1001 //                              for (size_t i=0; i<N; ++i){ 
    1002 //                                      F.inv( inv, *(Ai+i*lda) ); 
    1003 //                                      fscal( F, i, inv, Ai, lda ); 
    1004 //                                      fscal( F, M, inv, Bi, ldb ); 
    1005 //                                      Ai++; 
    1006 //                                      Bi++; 
    1007 //                              } 
    1008 //                      } 
    1009 //                      double alphad; 
    1010 //                      if (F.areEqual(alpha, Mone)) 
    1011 //                              alphad = -1.0; 
    1012 //                      else 
    1013 //                              F.convert( alphad, alpha ); 
    1014 //                      DoubleDomain::Element * Ad = new DoubleDomain::Element[N*N]; 
    1015 //                      DoubleDomain::Element * Bd = new DoubleDomain::Element[M*N]; 
    1016 //                      MatF2MatD( F, Ad, N, A, lda, N, N ); 
    1017 //                      MatF2MatD( F, Bd, N, B, ldb, M, N ); 
    1018 //                      cblas_dtrsm(  CblasRowMajor, CblasRight, CblasUpper, CblasNoTrans, 
    1019 //                                    CblasUnit, M, N, alphad, Ad, N, Bd, N ); 
    1020 //                      delete[] Ad; 
    1021 //                      MatD2MatF( F, B, ldb, Bd, N, M, N ); 
    1022 //                      delete[] Bd; 
    1023 //                      if (Diag == FflasNonUnit ){ 
    1024 //                              //Denormalization of A 
    1025 //                              typename Field::Element *  Ai=A; 
    1026 //                              for (size_t i=0; i<N; ++i){ 
    1027 //                                      fscal( F, i, *(Ai+i*lda), Ai, lda ); 
    1028 //                                      Ai++; 
    1029 //                              }        
    1030 //                      } 
    1031 //              } 
    1032 //              else{ 
    1033 //                      size_t Nup=N>>1; 
    1034 //                      size_t Ndown = N-Nup; 
    1035 //                      operator()( F, Diag, M, Nup, alpha, A, lda, B, ldb, nmax); 
    1036 //                      fgemm( F, FflasNoTrans, FflasNoTrans, M, Ndown, Nup, 
    1037 //                             Mone, B, ldb, A+Nup, lda, alpha, B+Nup, ldb); 
    1038 //                      operator()( F, Diag, M, Ndown, one,  
    1039 //                                  A+Nup*(lda+1), lda, B+Nup, ldb, nmax); 
    1040 //              } 
    1041          
    1042 //      } 
    1043 // }; 
    1044  
    1045 // template <> 
    1046 // class FFLAS::callFtrsmRightUpNoTrans<double>{ 
    1047 // public: 
    1048 //      template<class Field> 
    1049 //      void operator() (const Field& F, const FFLAS_DIAG Diag,  
    1050 //                       const size_t M, const size_t N, const typename Field::Element alpha, 
    1051 //                       typename Field::Element * A, const size_t lda, 
    1052 //                       typename Field::Element * B, const size_t ldb, const size_t nmax){ 
    1053                  
    1054 //              static typename Field::Element Mone; 
    1055 //              static typename Field::Element one; 
    1056 //              F.init(one, 1.0); 
    1057 //              F.neg(Mone,one); 
    1058 //              if ( N <= nmax ){ 
    1059 //                      typename Field::Element inv; 
    1060 //                      if (Diag == FflasNonUnit ){ 
    1061 //                              //Normalization of A and B 
    1062 //                              typename Field::Element *  Ai = A, * Bi = B; 
    1063 //                              for (size_t i=0; i<N; ++i){ 
    1064 //                                      F.inv( inv, *(Ai+i*lda) ); 
    1065 //                                      fscal( F, i, inv, Ai, lda ); 
    1066 //                                      fscal( F, M, inv, Bi, ldb ); 
    1067 //                                      Ai++; 
    1068 //                                      Bi++; 
    1069 //                              } 
    1070 //                      } 
    1071 //                      cblas_dtrsm(  CblasRowMajor, CblasRight, CblasUpper, CblasNoTrans, 
    1072 //                                    CblasUnit, M, N, alpha, A, lda, B, ldb ); 
    1073 //                      for (size_t i=0; i< M; ++i) 
    1074 //                              for (size_t j=0; j<N; ++j){ 
    1075 //                                      F.init(*(B+i*ldb+j),*(B+i*ldb+j)); 
    1076                                  
    1077 //                              } 
    1078 //                      if (Diag == FflasNonUnit ){ 
    1079 //                              //Denormalization of A 
    1080 //                              typename Field::Element *  Ai=A; 
    1081 //                              for (size_t i=0; i<N; ++i){ 
    1082 //                                      fscal( F, i, *(Ai+i*lda), Ai, lda ); 
    1083 //                                      Ai++; 
    1084 //                              } 
    1085 //                              //Correction on B 
    1086 //                              // Ai =A; 
    1087 //                              //                      typename Field::Element *Bi=B; 
    1088 //                              //                      for (size_t i=0; i<N; ++i){ 
    1089 //                              //                              F.inv( inv, *Ai); 
    1090 //                              //                              fscal( F, M, inv, Bi, ldb ); 
    1091 //                              //                              Ai += lda+1; Bi++; 
    1092 //                              //                      } 
    1093 //                      } 
    1094 //              } 
    1095 //              else{ 
    1096 //                      size_t Nup=N>>1; 
    1097 //                      size_t Ndown = N-Nup; 
    1098 //                      this->operator()( F, Diag, M, Nup, alpha, A, lda, B, ldb, nmax); 
    1099 //                      fgemm( F, FflasNoTrans, FflasNoTrans, M, Ndown, Nup, 
    1100 //                             Mone, B, ldb, A+Nup, lda, alpha, B+Nup, ldb); 
    1101 //                      this->operator()( F, Diag, M, Ndown, one,  
    1102 //                                        A+Nup*(lda+1), lda, B+Nup, ldb, nmax); 
    1103 //              } 
    1104 //      } 
    1105 // }; 
    1106  
    1107 // template <> 
    1108 // class FFLAS::callFtrsmRightUpNoTrans<float>{ 
    1109 // public: 
    1110 //      template<class Field> 
    1111 //      void operator() (const Field& F, const FFLAS_DIAG Diag,  
    1112 //                       const size_t M, const size_t N, const typename Field::Element alpha, 
    1113 //                       typename Field::Element * A, const size_t lda, 
    1114 //                       typename Field::Element * B, const size_t ldb, const size_t nmax){ 
    1115                  
    1116 //              static typename Field::Element Mone; 
    1117 //              static typename Field::Element one; 
    1118 //              F.init(one, 1.0); 
    1119 //              F.neg(Mone,one); 
    1120 //              if ( N <= nmax ){ 
    1121 //                      typename Field::Element inv; 
    1122 //                      if (Diag == FflasNonUnit ){ 
    1123 //                              //Normalization of A and B 
    1124 //                              typename Field::Element *  Ai = A, * Bi = B; 
    1125 //                              for (size_t i=0; i<N; ++i){ 
    1126 //                                      F.inv( inv, *(Ai+i*lda) ); 
    1127 //                                      fscal( F, i, inv, Ai, lda ); 
    1128 //                                      fscal( F, M, inv, Bi, ldb ); 
    1129 //                                      Ai++; 
    1130 //                                      Bi++; 
    1131 //                              } 
    1132 //                      } 
    1133 //                      cblas_strsm(  CblasRowMajor, CblasRight, CblasUpper, CblasNoTrans, 
    1134 //                                    CblasUnit, M, N, alpha, A, lda, B, ldb ); 
    1135 //                      for (size_t i=0; i< M; ++i) 
    1136 //                              for (size_t j=0; j<N; ++j){ 
    1137 //                                      F.init(*(B+i*ldb+j),*(B+i*ldb+j)); 
    1138                                  
    1139 //                              } 
    1140 //                      if (Diag == FflasNonUnit ){ 
    1141 //                              //Denormalization of A 
    1142 //                              typename Field::Element *  Ai=A; 
    1143 //                              for (size_t i=0; i<N; ++i){ 
    1144 //                                      fscal( F, i, *(Ai+i*lda), Ai, lda ); 
    1145 //                                      Ai++; 
    1146 //                              } 
    1147 //                              //Correction on B 
    1148 //                              // Ai =A; 
    1149 //                              //                      typename Field::Element *Bi=B; 
    1150 //                              //                      for (size_t i=0; i<N; ++i){ 
    1151 //                              //                              F.inv( inv, *Ai); 
    1152 //                              //                              fscal( F, M, inv, Bi, ldb ); 
    1153 //                              //                              Ai += lda+1; Bi++; 
    1154 //                              //                      } 
    1155 //                      } 
    1156 //              } 
    1157 //              else{ 
    1158 //                      size_t Nup=N>>1; 
    1159 //                      size_t Ndown = N-Nup; 
    1160 //                      this->operator()( F, Diag, M, Nup, alpha, A, lda, B, ldb, nmax); 
    1161 //                      fgemm( F, FflasNoTrans, FflasNoTrans, M, Ndown, Nup, 
    1162 //                             Mone, B, ldb, A+Nup, lda, alpha, B+Nup, ldb); 
    1163 //                      this->operator()( F, Diag, M, Ndown, one,  
    1164 //                                        A+Nup*(lda+1), lda, B+Nup, ldb, nmax); 
    1165 //              } 
    1166 //      } 
    1167 // }; 
    1168  
    1169  
    1170  
    1171 // template<class Field> 
    1172 // inline void 
    1173 // FFLAS::ftrsmRightUpTrans(const Field& F, const FFLAS_DIAG Diag,  
    1174 //                     const size_t M, const size_t N, 
    1175 //                     const typename Field::Element alpha, 
    1176 //                     const typename Field::Element * A, const size_t lda, 
    1177 //                     typename Field::Element * B, const size_t ldb){ 
    1178          
    1179 //      static typename Field::Element Mone; 
    1180 //      static typename Field::Element one; 
    1181 //      F.init(Mone, -1.0); 
    1182 //      F.init(one, 1.0); 
    1183 //      if ( N==1 ){ 
    1184 //              if (Diag == FflasNonUnit ){ 
    1185 //                      typename Field::Element inv; 
    1186 //                      F.inv(inv, *A); 
    1187 //                      fscal(F, M, inv, B, ldb); 
    1188 //              } 
    1189 //      } 
    1190 //      else{    
    1191 //              size_t Nup=N>>1; 
    1192 //              size_t Ndown = N-Nup; 
    1193 //              ftrsmRightUpTrans( F, Diag, M, Nup, alpha, A, lda, B, ldb); 
    1194 //              fgemm( F, FflasNoTrans, FflasTrans, M, Ndown, Nup, Mone,  
    1195 //                     B, ldb, A+Nup*lda, lda, alpha, B+Nup, ldb); 
    1196 //              ftrsmRightUpTrans( F, Diag, M, Ndown, one,  
    1197 //                                 A+Nup*(lda+1), lda, B+Nup, ldb); 
    1198 //      } 
    1199 // } 
    1200  
    1201  
    1202 // template<class Field> 
    1203 // inline void 
    1204 // FFLAS::ftrsmRightLowNoTrans(const Field& F, const FFLAS_DIAG Diag,  
    1205 //                        const size_t M, const size_t N, 
    1206 //                        const typename Field::Element alpha, 
    1207 //                        const typename Field::Element * A, const size_t lda, 
    1208 //                        typename Field::Element * B, const size_t ldb){ 
    1209          
    1210 //      static typename Field::Element Mone; 
    1211 //      static typename Field::Element one; 
    1212 //      F.init(Mone, -1.0); 
    1213 //      F.init(one, 1.0); 
    1214 //      if ( N==1 ){ 
    1215 //              if (Diag == FflasNonUnit ){ 
    1216 //                      typename Field::Element inv; 
    1217 //                      F.inv(inv, *A); 
    1218 //                      fscal(F, M, inv, B, ldb); 
    1219 //              } 
    1220 //      } 
    1221 //      else{    
    1222 //              size_t Nup=N>>1; 
    1223 //              size_t Ndown = N-Nup; 
    1224 //              ftrsmRightLowNoTrans( F, Diag, M, Ndown, alpha,  
    1225 //                                    A+Nup*(lda+1), lda, B+Nup, ldb); 
    1226 //              fgemm( F, FflasNoTrans, FflasNoTrans, M, Nup, Ndown, 
    1227 //                     Mone, B+Nup, ldb, A+Nup*lda, lda, alpha, B, ldb); 
    1228 //              ftrsmRightLowNoTrans( F, Diag, M, Nup, one, A, lda, B, ldb); 
    1229 //      } 
    1230 // } 
    1231  
    1232 // template<class Field> 
    1233 // inline void 
    1234 // FFLAS::ftrsmRightLowTrans(const Field& F, const FFLAS_DIAG Diag,  
    1235 //                        const size_t M, const size_t N, 
    1236 //                        const typename Field::Element alpha, 
    1237 //                        const typename Field::Element * A, const size_t lda, 
    1238 //                        typename Field::Element * B, const size_t ldb){ 
    1239          
    1240 //      static typename Field::Element Mone; 
    1241 //      static typename Field::Element one; 
    1242 //      F.init(Mone, -1.0); 
    1243 //      F.init(one, 1.0); 
    1244 //      if ( N==1 ){ 
    1245 //              if (Diag == FflasNonUnit ){ 
    1246 //                      typename Field::Element inv; 
    1247 //                      F.inv(inv, *A); 
    1248 //                      fscal(F, M, inv, B, ldb); 
    1249 //              } 
    1250 //      } 
    1251 //      else{ 
    1252 //              size_t Nup=N>>1; 
    1253 //              size_t Ndown = N-Nup; 
    1254 //              ftrsmRightLowTrans( F, Diag, M, Ndown, alpha,  
    1255 //                                  A+Nup*(lda+1), lda, B+Nup, ldb); 
    1256 //              fgemm( F, FflasNoTrans, FflasTrans, M, Nup, Ndown, Mone,  
    1257 //                     B+Nup, ldb, A+Nup, lda, alpha, B, ldb); 
    1258 //              ftrsmRightLowTrans( F, Diag, M, Nup, one, A, lda, B, ldb); 
    1259 //      } 
    1260 // }