Changeset 9

Show
Ignore:
Timestamp:
03/14/07 10:27:52 (2 years ago)
Author:
pernet
Message:

v1.1.2
Change the detection of field representation using double (previous one was not working)

Files:
9 modified

Legend:

Unmodified
Added
Removed
  • ChangeLog

    r4 r9  
     12007-03-13 v1.1.2 
     2        * change the genericity system for trsm to detect Field 
     3        implementations over double (compatibility with LinBox) 
    142007-03-11 v1.1.1 
    25        * complete preconditioning phase for the new Charpoly algorithm 
  • Makefile

    r4 r9  
    1 VERSION=1.1.1 
     1VERSION=1.1.2 
    22 
    33FFLAS_FFPACK_DIR=/home/pernet/Logiciels/fflas-ffpack 
     
    2222linbox: 
    2323 
    24         cp ${FFLAS_FFPACK_DIR}/include/fflas-ffpack/{fflas.h,fflas_fgemm.inl,fflas_fgemv.inl,fflas_ftrsm.inl,fflas_ftrsv.inl,fflas_ftrmm.inl,fflas_fdot.inl,fflas_fcopy.inl,fflas_faxpy.inl,fflas_fger.inl} ${LINBOX_DIR}/linbox/fflas/ 
     24        cp ${FFLAS_FFPACK_DIR}/include/fflas-ffpack/{fflas.h,fflas_fgemm.inl,fflas_fgemv.inl,fflas_ftrsm.inl,fflas_ftrsv.inl,fflas_ftrmm.inl,fflas_fdot.inl,fflas_fcopy.inl,fflas_faxpy.inl,fflas_fger.inl,fflas_bounds.inl} ${LINBOX_DIR}/linbox/fflas/ 
    2525        cp ${FFLAS_FFPACK_DIR}/include/fflas-ffpack/{ffpack.h,ffpack_charpoly.inl,ffpack_frobenius.inl,ffpack_ludivine.inl,ffpack_minpoly.inl,ffpack_krylovelim.inl,ffpack_charpoly_danilevski.inl,ffpack_charpoly_kglu.inl,ffpack_charpoly_kgfast.inl,ffpack_charpoly_kgfastgeneralized.inl} ${LINBOX_DIR}/linbox/ffpack/ 
    2626 
  • README

    r4 r9  
    11  ******  FFLAS-FFPACK : Finite Field Linear Algebra Subroutines/Package ******   
    22 
    3 Version 1.1.1 
     3Version 1.1.2 
    44 
    55PURPOSE: 
  • include/fflas-ffpack/fflas.h

    r6 r9  
    390390                                 const typename Field::Element beta, 
    391391                                 typename Field::Element * Y, const size_t incY); 
    392         template<class Field> 
    393         static void MatVectProd_gen (const Field& F,  
    394                                      const enum FFLAS_TRANSPOSE TransA,  
    395                                      const size_t M, const size_t N, 
    396                                      const typename Field::Element alpha,  
    397                                      const typename Field::Element * A, const size_t lda, 
    398                                      const typename Field::Element * X, const size_t incX,  
    399                                      const typename Field::Element beta, 
    400                                      typename Field::Element * Y, const size_t incY); 
    401         template<class Field> 
    402         static void MatVectProd_dbl (const Field& F,  
    403                                      const enum FFLAS_TRANSPOSE TransA,  
    404                                      const size_t M, const size_t N, 
    405                                      const double alpha,  
    406                                      const double * A, const size_t lda, 
    407                                      const double * X, const size_t incX,  
    408                                      const double beta, 
    409                                      double * Y, const size_t incY); 
    410          
    411         template<class Field> 
    412         static typename Field::Element* fsquare_gen (const Field& F, 
    413                                                      const enum FFLAS_TRANSPOSE ta, 
    414                                                      const size_t n, 
    415                                                      const typename Field::Element alpha, 
    416                                                      const typename Field::Element* A,  
    417                                                      const size_t lda, 
    418                                                      const typename Field::Element beta, 
    419                                                      typename Field::Element* C,  
    420                                                      const size_t ldc); 
    421         template<class Field> 
    422         static double* fsquare_dbl (const Field& F, 
    423                                                      const enum FFLAS_TRANSPOSE ta, 
    424                                                      const size_t n, 
    425                                                      const double alpha, 
    426                                                      const double* A,  
    427                                                      const size_t lda, 
    428                                                      const double beta, 
    429                                                      double* C,  
    430                                                      const size_t ldc); 
    431392 
    432393        template <class Field> 
     
    441402                                  typename Field::Element * C, const size_t ldc,  
    442403                                  const size_t kmax ); 
    443         template <class Field> 
    444         static void ClassicMatmul_gen (const Field& F,   
    445                                        const enum FFLAS_TRANSPOSE ta, 
    446                                        const enum FFLAS_TRANSPOSE tb, 
    447                                        const size_t m, const size_t n, const size_t k, 
    448                                        const typename Field::Element alpha, 
    449                                        const typename Field::Element * A, const size_t lda, 
    450                                        const typename Field::Element * B, const size_t ldb, 
    451                                        const typename Field::Element beta, 
    452                                        typename Field::Element * C, const size_t ldc,  
    453                                        const size_t kmax ); 
    454  
    455         template <class Field> 
    456         static void ClassicMatmul_dbl (const Field& F,   
    457                                        const enum FFLAS_TRANSPOSE ta, 
    458                                        const enum FFLAS_TRANSPOSE tb, 
    459                                        const size_t m, const size_t n, const size_t k, 
    460                                        const double alpha, 
    461                                        const double * A, const size_t lda, 
    462                                        const double * B, const size_t ldb, 
    463                                        const double beta, 
    464                                        double * C, const size_t ldc,  
    465                                        const size_t kmax ); 
    466404     
    467405        // Winograd Multiplication  alpha.A(n*k) * B(k*m) + beta . C(n*m) 
     
    490428                              typename Field::Element * C, const size_t ldc, 
    491429                              const size_t kmax, const size_t w); 
    492         template<class Field> 
    493         static void WinoMain_gen (const Field& F,  
    494                                   const enum FFLAS_TRANSPOSE ta, 
    495                                   const enum FFLAS_TRANSPOSE tb, 
    496                                   const size_t m, const size_t n, const size_t k, 
    497                                   const typename Field::Element alpha, 
    498                                   const typename Field::Element* A,const size_t lda, 
    499                                   const typename Field::Element* B,const size_t ldb, 
    500                                   const typename Field::Element beta, 
    501                                   typename Field::Element * C, const size_t ldc, 
    502                                   const size_t kmax, const size_t w); 
    503  
    504         template<class Field> 
    505         static void WinoMain_dbl (const Field& F,  
    506                                   const enum FFLAS_TRANSPOSE ta, 
    507                                   const enum FFLAS_TRANSPOSE tb, 
    508                                   const size_t m, const size_t n, const size_t k, 
    509                                   const double alpha, 
    510                                   const double* A,const size_t lda, 
    511                                   const double* B,const size_t ldb, 
    512                                   const double beta, 
    513                                   double * C, const size_t ldc, 
    514                                   const size_t kmax, const size_t w); 
    515  
     430        template<bool AreEq> 
     431        class callWinoMain; 
     432 
     433        template<bool AreEq> 
     434        class callClassicMatmul; 
     435 
     436        template<bool AreEq> 
     437        class callFsquare; 
     438 
     439        template<bool AreEq> 
     440        class callMatVectProd; 
     441                 
    516442        // Specialized routines for ftrsm 
    517443        template<class Field> 
     
    536462                                         typename Field::Element * B, const size_t ldb,  
    537463                                         const size_t nmax); 
    538         template<class Field> 
    539         static void ftrsmLeftLowNoTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,  
    540                                              const size_t M, const size_t N, 
    541                                              const double alpha, 
    542                                              double * A, const size_t lda, 
    543                                              double * B, const size_t ldb,  
    544                                              const size_t nmax); 
    545         template<class Field> 
    546         static void ftrsmLeftLowNoTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,  
    547                                              const size_t M, const size_t N, 
    548                                              const typename Field::Element alpha, 
    549                                              typename Field::Element * A, const size_t lda, 
    550                                              typename Field::Element * B, const size_t ldb,  
    551                                              const size_t nmax); 
     464        template<bool AreEq> 
     465        class callFtrsmLeftLowNoTrans; 
     466         
     467        template<bool AreEq> 
     468        class callFtrsmRightUpNoTrans; 
     469         
     470        template<bool AreEq> 
     471        class callFtrmmLeftUpNoTrans; 
     472         
     473        template<bool AreEq> 
     474        class callFtrmmLeftUpTrans; 
     475 
     476        template<bool AreEq> 
     477        class callFtrmmLeftLowNoTrans;           
     478 
     479        template<bool AreEq> 
     480        class callFtrmmLeftLowTrans;             
     481 
     482        template<bool AreEq> 
     483        class callFtrmmRightUpNoTrans;           
     484 
     485        template<bool AreEq> 
     486        class callFtrmmRightUpTrans;             
     487 
     488        template<bool AreEq> 
     489        class callFtrmmRightLowNoTrans;          
     490 
     491        template<bool AreEq> 
     492        class callFtrmmRightLowTrans;            
     493         
    552494        template<class Field> 
    553495        static void ftrsmLeftLowTrans (const Field& F, const enum FFLAS_DIAG Diag,  
     
    564506                                         typename Field::Element * B, const size_t ldb, 
    565507                                         const size_t nmax); 
    566         template<class Field> 
    567         static void ftrsmRightUpNoTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,  
    568                                              const size_t M, const size_t N, 
    569                                              const double alpha, 
    570                                              double * A, const size_t lda, 
    571                                              double * B, const size_t ldb, 
    572                                              const size_t nmax); 
    573         template<class Field> 
    574         static void ftrsmRightUpNoTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,  
    575                                              const size_t M, const size_t N, 
    576                                              const typename Field::Element alpha, 
    577                                              typename Field::Element * A, const size_t lda, 
    578                                              typename Field::Element * B, const size_t ldb, 
    579                                              const size_t nmax); 
    580  
     508         
    581509        template<class Field> 
    582510        static void ftrsmRightUpTrans (const Field& F, const enum FFLAS_DIAG Diag,  
     
    607535                                        typename Field::Element * B, const size_t ldb,  
    608536                                        const size_t nmax); 
    609         template<class Field> 
    610         static void ftrmmLeftUpNoTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,  
    611                                             const size_t M, const size_t N, 
    612                                             const typename Field::Element * A, const size_t lda, 
    613                                             typename Field::Element * B, const size_t ldb,  
    614                                             const size_t nmax); 
    615         template<class Field> 
    616         static void ftrmmLeftUpNoTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,  
    617                                             const size_t M, const size_t N, 
    618                                             const double * A, const size_t lda, 
    619                                             double * B, const size_t ldb,  
    620                                             const size_t nmax); 
    621537 
    622538        template<class Field> 
     
    626542                                      typename Field::Element * B, const size_t ldb, 
    627543                                      const size_t nmax); 
    628         template<class Field> 
    629         static void ftrmmLeftUpTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,  
    630                                           const size_t M, const size_t N, 
    631                                           const typename Field::Element * A, const size_t lda, 
    632                                           typename Field::Element * B, const size_t ldb, 
    633                                           const size_t nmax); 
    634         template<class Field> 
    635         static void ftrmmLeftUpTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,  
    636                                           const size_t M, const size_t N, 
    637                                           const double * A, const size_t lda, 
    638                                           double * B, const size_t ldb, 
    639                                           const size_t nmax); 
    640544 
    641545        template<class Field> 
     
    645549                                         typename Field::Element * B, const size_t ldb,  
    646550                                         const size_t nmax); 
    647         template<class Field> 
    648         static void ftrmmLeftLowNoTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,  
    649                                              const size_t M, const size_t N, 
    650                                              const typename Field::Element * A, const size_t lda, 
    651                                              typename Field::Element * B, const size_t ldb,  
    652                                              const size_t nmax); 
    653         template<class Field> 
    654         static void ftrmmLeftLowNoTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,  
    655                                              const size_t M, const size_t N, 
    656                                              const double * A, const size_t lda, 
    657                                              double * B, const size_t ldb,  
    658                                              const size_t nmax); 
    659551 
    660552        template<class Field> 
     
    664556                                       typename Field::Element * B, const size_t ldb, 
    665557                                       const size_t nmax); 
    666         template<class Field> 
    667         static void ftrmmLeftLowTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,  
    668                                            const size_t M, const size_t N, 
    669                                            const typename Field::Element * A, const size_t lda, 
    670                                            typename Field::Element * B, const size_t ldb, 
    671                                            const size_t nmax); 
    672         template<class Field> 
    673         static void ftrmmLeftLowTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,  
    674                                            const size_t M, const size_t N, 
    675                                            const double * A, const size_t lda, 
    676                                            double * B, const size_t ldb, 
    677                                            const size_t nmax); 
    678558         
    679559        template<class Field> 
     
    683563                                         typename Field::Element * B, const size_t ldb,  
    684564                                         const size_t nmax); 
    685         template<class Field> 
    686         static void ftrmmRightUpNoTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,  
    687                                              const size_t M, const size_t N, 
    688                                              const typename Field::Element * A, const size_t lda, 
    689                                              typename Field::Element * B, const size_t ldb,  
    690                                              const size_t nmax); 
    691         template<class Field> 
    692         static void ftrmmRightUpNoTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,  
    693                                              const size_t M, const size_t N, 
    694                                              const double * A, const size_t lda, 
    695                                              double * B, const size_t ldb,  
    696                                              const size_t nmax); 
    697565 
    698566        template<class Field> 
     
    702570                                       typename Field::Element * B, const size_t ldb,  
    703571                                       const size_t nmax); 
    704         template<class Field> 
    705         static void ftrmmRightUpTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,  
    706                                            const size_t M, const size_t N, 
    707                                            const typename Field::Element * A, const size_t lda, 
    708                                            typename Field::Element * B, const size_t ldb,  
    709                                            const size_t nmax); 
    710         template<class Field> 
    711         static void ftrmmRightUpTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,  
    712                                            const size_t M, const size_t N, 
    713                                            const double * A, const size_t lda, 
    714                                            double * B, const size_t ldb,  
    715                                            const size_t nmax); 
    716572 
    717573        template<class Field> 
     
    722578                                          const size_t nmax); 
    723579        template<class Field> 
    724         static void ftrmmRightLowNoTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,  
    725                                               const size_t M, const size_t N, 
    726                                               const typename Field::Element * A, const size_t lda, 
    727                                               typename Field::Element * B, const size_t ldb, 
    728                                               const size_t nmax); 
    729         template<class Field> 
    730         static void ftrmmRightLowNoTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,  
    731                                               const size_t M, const size_t N, 
    732                                               const double * A, const size_t lda, 
    733                                               double * B, const size_t ldb, 
    734                                               const size_t nmax); 
    735  
    736         template<class Field> 
    737580        static void ftrmmRightLowTrans (const Field& F, const enum FFLAS_DIAG Diag,  
    738581                                        const size_t M, const size_t N, 
     
    740583                                        typename Field::Element * B, const size_t ldb,  
    741584                                        const size_t nmax); 
    742         template<class Field> 
    743         static void ftrmmRightLowTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,  
    744                                             const size_t M, const size_t N, 
    745                                             const typename Field::Element * A, const size_t lda, 
    746                                             typename Field::Element * B, const size_t ldb,  
    747                                             const size_t nmax); 
    748         template<class Field> 
    749         static void ftrmmRightLowTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,  
    750                                             const size_t M, const size_t N, 
    751                                             const double * A, const size_t lda, 
    752                                             double * B, const size_t ldb,  
    753                                             const size_t nmax); 
    754585}; // class FFLAS 
    755586 
  • include/fflas-ffpack/fflas_fgemm.inl

    r1 r9  
    5555                           const size_t kmax) 
    5656{ 
    57         if (AreEqual<typename Field::Element,double>::value) 
    58                 ClassicMatmul_dbl (F,ta,tb,m,n,k,alpha,A,lda,B,ldb,beta,C,ldc,kmax); 
    59         else 
    60                 ClassicMatmul_gen (F,ta,tb,m,n,k,alpha,A,lda,B,ldb,beta,C,ldc,kmax); 
     57        callClassicMatmul<AreEqual<typename Field::Element,double>::value> (F,ta,tb,m,n,k,alpha,A,lda,B,ldb,beta,C,ldc,kmax); 
    6158} 
    6259 
    63 template  < class Field >  
    64 void FFLAS::ClassicMatmul_gen (const Field& F,   
    65                                const enum FFLAS_TRANSPOSE ta, 
    66                                const enum FFLAS_TRANSPOSE tb, 
    67                                const size_t m, const size_t n,const size_t k, 
    68                                const typename Field::Element alpha, 
    69                                const typename Field::Element * A, const size_t lda, 
    70                                const typename Field::Element * B, const size_t ldb, 
    71                                const typename Field::Element beta, 
    72                                typename Field::Element* C, const size_t ldc, 
    73                                const size_t kmax) 
    74 { 
    75         static  typename Field::Element Mone; 
    76         static  typename Field::Element one; 
    77         static  typename Field::Element zero; 
    78         F.init(one, 1.0); 
    79         F.neg(Mone, one); 
    80         F.init(zero, 0.0); 
    81         typename Field::Element tmp; 
    82         DoubleDomain::Element alphad, betad; 
    83         size_t k2 = MIN(k,kmax-1); // Size of the blocks 
    84          
    85         if (k2 > 1) { 
    86                 DoubleDomain::Element * Add = new DoubleDomain::Element[m*k2]; 
    87                 DoubleDomain::Element * Bdd = new DoubleDomain::Element[k2*n]; 
    88                 DoubleDomain::Element * Cd = new DoubleDomain::Element[m*n]; 
    89          
     60template<> 
     61class FFLAS::callClassicMatmul<false>{ 
     62public: 
     63        template  < class Field > 
     64        void operator() (const Field& F,   
     65                         const enum FFLAS_TRANSPOSE ta, 
     66                         const enum FFLAS_TRANSPOSE tb, 
     67                         const size_t m, const size_t n,const size_t k, 
     68                         const typename Field::Element alpha, 
     69                         const typename Field::Element * A, const size_t lda, 
     70                         const typename Field::Element * B, const size_t ldb, 
     71                         const typename Field::Element beta, 
     72                         typename Field::Element* C, const size_t ldc, 
     73                         const size_t kmax) { 
     74                static  typename Field::Element Mone; 
     75                static  typename Field::Element one; 
     76                static  typename Field::Element zero; 
     77                F.init(one, 1.0); 
     78                F.neg(Mone, one); 
     79                F.init(zero, 0.0); 
     80                typename Field::Element tmp; 
     81                DoubleDomain::Element alphad, betad; 
     82                size_t k2 = MIN(k,kmax-1); // Size of the blocks 
     83         
     84                if (k2 > 1) { 
     85                        DoubleDomain::Element * Add = new DoubleDomain::Element[m*k2]; 
     86                        DoubleDomain::Element * Bdd = new DoubleDomain::Element[k2*n]; 
     87                        DoubleDomain::Element * Cd = new DoubleDomain::Element[m*n]; 
     88         
     89                        size_t nblock = k / (kmax-1); 
     90                        size_t remblock = k % (kmax-1); 
     91                        if (!remblock) { 
     92                                remblock = kmax - 1 ; 
     93                                --nblock; 
     94                        } 
     95                        if (F.areEqual (Mone, beta)) 
     96                                betad = -1.0; 
     97                        else 
     98                                F.convert (betad, beta); 
     99         
     100                        if (F.areEqual (Mone, alpha)) 
     101                                alphad = -1.0; 
     102                        else { 
     103                                alphad = 1.0; 
     104                                if (! F.areEqual (one, alpha)) { 
     105                                        // Compute y = A*x + beta/alpha.y 
     106                                        // and after y *= alpha 
     107                                        F.div (tmp, beta, alpha); 
     108                                        F.convert (betad, tmp); 
     109                                } 
     110                        } 
     111         
     112                        size_t dlda, dldb; 
     113                        if (!F.isZero(beta)) 
     114                                MatF2MatD (F, Cd, n, C, ldc, m, n);  
     115 
     116                        if (ta == FflasTrans) {  
     117                                dlda = m;  
     118                                MatF2MatD (F, Add, dlda, A+k2*nblock*lda, lda, remblock, m);  
     119                        } else {  
     120                                dlda = k2;  
     121                                MatF2MatD (F, Add, dlda, A+k2*nblock, lda, m, remblock);         
     122                        } 
     123                        if (tb == FflasTrans) {  
     124                                dldb = k2;  
     125                                MatF2MatD (F, Bdd, k2, B+k2*nblock, ldb, n, remblock);  
     126                        } else {  
     127                                dldb = n;  
     128                                MatF2MatD (F, Bdd, dldb, B+k2*nblock*ldb, ldb, remblock, n);  
     129                        } 
     130         
     131                        ClassicMatmul (DoubleDomain(), ta, tb, m, n, remblock, alphad, Add, dlda, 
     132                                       Bdd, dldb, betad, Cd, n, kmax); 
     133                        MatD2MatF (F, C, ldc, Cd, n, m, n); 
     134                        MatF2MatD (F, Cd, n, C, ldc, m, n); 
     135 
     136                        for (size_t i = 0; i < nblock; ++i) { 
     137                                if (ta == FflasTrans) {  
     138                                        dlda = m;  
     139                                        MatF2MatD (F, Add, dlda, A+k2*i*lda, lda, k2, m);  
     140                                } else {  
     141                                        dlda = k2;  
     142                                        MatF2MatD (F, Add, dlda,  A+k2*i, lda, m, k2);  
     143                                } 
     144                                if (tb == FflasTrans) {  
     145                                        dldb = k2;  
     146                                        MatF2MatD (F, Bdd, dldb, B+k2*i, ldb, n, k2);  
     147                                } 
     148                                else {  
     149                                        dldb = n;  
     150                                        MatF2MatD (F, Bdd, dldb, B+k2*i*ldb, ldb, k2, n); 
     151                                } 
     152                                ClassicMatmul (DoubleDomain(), ta, tb, m, n, k2, alphad, Add, dlda, 
     153                                               Bdd, dldb, 1.0, Cd, n, kmax); 
     154                                MatD2MatF (F, C, ldc, Cd, n, m, n); 
     155                                MatF2MatD (F, Cd, n, C, ldc, m, n);