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_ftrmm_src.inl

    r36 r38  
    2929  #define __FFLAS__Aupdate __FFLAS__Atriang + nsplit * __FFLAS__Arowinc 
    3030  #define __FFLAS__Arest A + nbblocsplit * nsplit * (lda+1) 
    31   #define __FFLAS__Bupdate B + (nbblocsplit - (i+1)) * nsplit * ldb 
    32   #define __FFLAS__Brec B + (nbblocsplit - i) * nsplit * ldb 
     31  #define __FFLAS__Brec B + (nbblocsplit - (i+1)) * nsplit * ldb 
     32  #define __FFLAS__Bupdate B + (nbblocsplit - i) * nsplit * ldb 
    3333  #define __FFLAS__Brest B + nbblocsplit * nsplit * ldb 
    34   #define __FFLAS__A1 A + nsplit * (lda + 1) 
    35   #define __FFLAS__A2 A + nsplit * __FFLAS__Arowinc 
     34  #define __FFLAS__A1 A + (nsplit) * (lda + 1) 
     35  #define __FFLAS__A2 A + (nsplit) * __FFLAS__Arowinc 
    3636  #define __FFLAS__A3 A 
    37   #define __FFLAS__B1 B + nsplit * ldb 
     37  #define __FFLAS__B1 B + (nsplit) * ldb  
    3838  #define __FFLAS__B2 B  
    3939#else 
    40   #define __FFLAS__Atriang A + i * nsplit * (lda + 1) 
    41   #define __FFLAS__Aupdate A + (i+1) * nsplit * __FFLAS__Acolinc 
     40  #define __FFLAS__Atriang A + (nrestsplit + i * nsplit) * (lda + 1) 
     41  #define __FFLAS__Aupdate A + (nrestsplit + i * nsplit) * __FFLAS__Acolinc 
    4242  #define __FFLAS__Arest A  
    43   #define __FFLAS__Bupdate B + (nrestsplit + i * nsplit) * ldb 
    44   #define __FFLAS__Brec B + MAX(0, int (nrestsplit) + (i-1) * nsplit) * ldb 
     43  #define __FFLAS__Brec B + (nrestsplit + i * nsplit) * ldb 
     44  #define __FFLAS__Bupdate B 
    4545  #define __FFLAS__Brest B 
    4646  #define __FFLAS__A1 A  
    47   #define __FFLAS__A2 A + nsplit * __FFLAS__Acolinc 
    48   #define __FFLAS__A3 A + nsplit * (lda + 1) 
    49   #define __FFLAS__B1 B 
    50   #define __FFLAS__B2 B + nsplit * ldb 
     47  #define __FFLAS__A2 A + (M-nsplit) * __FFLAS__Acolinc 
     48  #define __FFLAS__A3 A + (M-nsplit) * (lda + 1) 
     49  #define __FFLAS__B1 B  
     50  #define __FFLAS__B2 B + (M-nsplit) * ldb 
    5151 #endif 
    5252#else    
     
    6767  #define __FFLAS__Aupdate __FFLAS__Atriang + nsplit * __FFLAS__Acolinc 
    6868  #define __FFLAS__Arest A + nbblocsplit * nsplit * (lda+1) 
    69   #define __FFLAS__Bupdate B + (nbblocsplit - (i+1)) * nsplit  
    70   #define __FFLAS__Brec B + (nbblocsplit - i) * nsplit  
     69  #define __FFLAS__Brec B + (nbblocsplit - (i+1)) * nsplit  
     70  #define __FFLAS__Bupdate B + (nbblocsplit - i) * nsplit  
    7171  #define __FFLAS__Brest B + nbblocsplit * nsplit 
    72   #define __FFLAS__A1 A + nsplit * (lda + 1) 
    73   #define __FFLAS__A2 A + nsplit * __FFLAS__Acolinc 
     72  #define __FFLAS__A1 A + (nsplit) * (lda + 1) 
     73  #define __FFLAS__A2 A + (nsplit) * __FFLAS__Acolinc 
    7474  #define __FFLAS__A3 A 
    7575  #define __FFLAS__B1 B + nsplit 
    76   #define __FFLAS__B2 B 
    77 #else 
    78   #define __FFLAS__Atriang A + i * nsplit * (lda + 1) 
    79   #define __FFLAS__Aupdate A + (i+1) * nsplit * __FFLAS__Arowinc 
     76  #define __FFLAS__B2 B  
     77#else 
     78  #define __FFLAS__Atriang A + (nrestsplit + i * nsplit) * (lda + 1)  
     79  #define __FFLAS__Aupdate A + (nrestsplit + i * nsplit) * __FFLAS__Arowinc  
    8080  #define __FFLAS__Arest A 
    81   #define __FFLAS__Bupdate B + (nrestsplit + i * nsplit)  
    82   #define __FFLAS__Brec B + MAX(0, int (nrestsplit) + (i-1) * nsplit)  
     81  #define __FFLAS__Brec B + (nrestsplit + i * nsplit)  
     82  #define __FFLAS__Bupdate B  
    8383  #define __FFLAS__Brest B 
    8484  #define __FFLAS__A1 A 
    85   #define __FFLAS__A2 A + nsplit * __FFLAS__Arowinc 
    86   #define __FFLAS__A3 A + nsplit * (lda + 1) 
    87   #define __FFLAS__B1 B 
    88   #define __FFLAS__B2 B + nsplit  
     85  #define __FFLAS__A2 A + (N-nsplit) * __FFLAS__Arowinc 
     86  #define __FFLAS__A3 A + (N-nsplit) * (lda + 1) 
     87  #define __FFLAS__B1 B  
     88  #define __FFLAS__B2 B + N-nsplit  
    8989 #endif 
    9090#endif 
     
    159159        F.neg(Mone, one); 
    160160         
    161         static __FFLAS__DOMAIN D; 
    162         //size_t nblas = TRSMBound<Field> (F); 
    163  
    164         //size_t nbblocsblas = __FFLAS__Na / nblas; 
    165         //size_t nrestblas = __FFLAS__Na % nblas; 
    166161        size_t nsplit = DotProdBound (F, 0, one, 
    167162#ifdef __FFLAS__DOUBLE 
     
    171166#endif 
    172167                                    ); 
    173         //ndel = (ndel / nblas)*nblas; 
    174         //size_t nsplit = ndel;//MIN (ndel, (nbblocsblas+1) / 2 * nblas); 
     168 
    175169        size_t nbblocsplit = (__FFLAS__Na-1) / nsplit; 
    176170        size_t nrestsplit = ((__FFLAS__Na-1) % nsplit) +1; 
    177171         
    178         //std::cout<<"nblas, ndel, nsplit, nbblocsplit, nrestsplit = "<<nblas<<" "<<ndel<<" " 
    179         //<<nsplit<<" "<<nbblocsplit<<" "<<nrestsplit<<std::endl; 
    180  
    181         if (nrestsplit){ 
    182                 //std::cerr<<"nblas nrestsplit, M, N = "<<nblas<<" "<<nrestsplit<<" "<<M<<" "<<N<<std::endl; 
     172        if (nrestsplit) 
    183173                this->delayed (F, __FFLAS__Mbrest, __FFLAS__Nbrest, 
    184174                               __FFLAS__Arest, lda, __FFLAS__Brest, ldb); 
    185         } 
    186  
     175         
    187176        for ( size_t  i = 0; i < nbblocsplit; ++i) { 
    188177                 
    189 //              cerr<<"M,N,K = "<<M<<" "<<(N-(i+1)*nsplit)<<" "<<nsplit<<endl; 
    190178#ifdef __FFLAS__RIGHT 
    191179                fgemm (F, FflasNoTrans, Mjoin (Fflas, __FFLAS__TRANS), 
     
    197185                       __FFLAS__Aupdate, lda, __FFLAS__Brec, ldb, one, __FFLAS__Bupdate, ldb); 
    198186#endif 
     187 
    199188                this->delayed (F, __FFLAS__Mb, __FFLAS__Nb, 
    200189                               __FFLAS__Atriang, lda, __FFLAS__Brec, ldb); 
     
    222211        F.neg(Mone,one); 
    223212        if (__FFLAS__Na == 1) 
     213#ifdef __FFLAS__NONUNIT 
    224214                fscal(F, __FFLAS__Bdim, *A, B, __FFLAS__Bnorminc); 
    225  
    226         else { // __FFLAS__Na > 1 
     215#else 
     216       ; 
     217#endif 
     218         
     219         else { // __FFLAS__Na > 1 
    227220                size_t nsplit = __FFLAS__Na >> 1; 
    228                 this->operator() (F, __FFLAS__Mb, __FFLAS__Nb, __FFLAS__A1, lda, __FFLAS__B1, ldb); 
    229                 //      cerr<<"delay, Nup = "<<delay<<" "<<Nup<<endl; 
    230                 //cerr<<"M,N,K = "<<M<<" "<<Ndown<<" "<<Nup<<endl; 
    231  
     221                this->operator() (F, __FFLAS__Mb2, __FFLAS__Nb2, __FFLAS__A1, lda, __FFLAS__B1, ldb); 
     222                 
    232223#ifdef __FFLAS__RIGHT 
    233224                fgemm (F, FflasNoTrans , Mjoin (Fflas, __FFLAS__TRANS), 
    234225                       __FFLAS__Mb2, __FFLAS__Nb2, nsplit, one, 
    235                        __FFLAS__B1, ldb, __FFLAS__A2, lda, one, __FFLAS__B2, ldb); 
     226                       __FFLAS__B2, ldb, __FFLAS__A2, lda, one, __FFLAS__B1, ldb); 
    236227#else 
    237228                fgemm (F, Mjoin (Fflas, __FFLAS__TRANS), FflasNoTrans, 
    238229                       __FFLAS__Mb2, __FFLAS__Nb2, nsplit, one, 
    239                        __FFLAS__A2, lda, __FFLAS__B1, ldb, one, __FFLAS__B2, ldb); 
    240 #endif 
    241                 this->operator() (F, __FFLAS__Mb2, __FFLAS__Nb2, __FFLAS__A3, lda, __FFLAS__B2, ldb); 
     230                       __FFLAS__A2, lda, __FFLAS__B2, ldb, one, __FFLAS__B1, ldb); 
     231#endif 
     232                this->operator() (F, __FFLAS__Mb, __FFLAS__Nb, __FFLAS__A3, lda, __FFLAS__B2, ldb); 
    242233        } 
    243234}