****************************************************************************************** ************* E l i m i n a t i o n d' u n e C e l l u l e *************************** ****************************************************************************************** On part des blocs rangés sous les IC, et on fabrique la CtAB' permettant d'effectuer l'élimination de la Cellule. ..... | Cl > ``|`| | \_ | D |->| CtAB' | | ..... | F > ''|'' | ....... ...... | IC1 | -> | IC2 | |'''|'' '''''' | \_ | Ct_SV | | \__ | ABt_TV | en suivant un triple schéma : extraction, opération, ventilation ****************************************************************************************** ************* E x t r a c t i o n ****************************************************** ****************************************************************************************** PARTIE Ct On part des blocs Ct_SV de cette SV/IC; dimension : dimEta_SV x U Tr{IC}. On fabrique une Ct' pour la cellule, de dimension dimEta' x U Tr{IC}. Rq: il peut y avoir des composantes de Tr répétées, à travers x IC. <.SV1.> < .SV3. > Under Cl <.SV2.> < loop on : Fc I<---<->--->----------I < |/////// |IC1 loop on : IC |.....................| f1 < | \\\\\\\ |IC2 acces a un bloc Ct_SV | \\\\\\\ | loop on : lignes de Ct_SV |---------------------| < | //////////| f2 loop on : composantes de la ligne | //////////| < passage de # col(Eta_SV) a # col(Eta') de Ct' I---------------------I copie < Eta' > > ....... Ct' ........... > > <-Eta'=Union des SV---> > > PARTIE AB On part de banks ABt_TV de dimension dimEta x dimIC' avec IC' == U TV <-o-> IC; On fabrique une AB' (non transposée), couplant toutes les composantes de la cellule sensibles (Eta') à l'environnement (U TV); ce bloc est uniquement destiné au calcul du produit Ct.A-1B. dimension = dim U IC' x dim Eta' Rq: a priori, il ne devrait pas y avoir de composantes de Tr répétées, car un Tr multiplement connecté à une cellule doit l'être via différents SV. (et on a une seule SV par IC) .... A-1B' ........ Under Cl < loop on : Fc f1 f2 f3 < I<-------><----><-->I loop on : IC |.IC1.IC2. . | < |TVTVTVTV. . | acces a un bloc ABt_TV | . . | loop on : lignes de ABt_TV | . . | < | . . | Eta' loop on : composantes de la ligne | . . | < passage/extraction # col (Eta) | . . | a # ligne (Eta') de AB' | . . | copie |TV| | || . | > I<-|--|-|><----><-->I > IC1' IC2' > > > En ce qui concerne la descente de la navette, le calcul de AB.dFi est peu couteux, et on utilise directement les blocs ABt_TV. ****************************************************************************************** ************* P R O D U I T ************************************************************* ****************************************************************************************** Le résultat CtAB' = Ct' x AB', de dimension dim U{IC'} x dim U{IC}, est rangé sous la cellule. Selon la proposition ci-dessous, ce bank pourrait comporter la somme avec D'. Exemple avec : SUBROUTINE SGEMM ( OA, OB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC ) 'n' Alpha*[A] (*) [B] (+) Beta*[C]; 't'ou'c' Alpha*[A]_t (*) 't' (*) [B]_t (+) Beta*[C]; Op(A) : M rows as [C] [A] real A(LDA,*) Op(B) N cols as [C] [B] real B(LDB,*) [C} real C(LDC,*) Op(A) K cols as OpB rows CALL SGEMM ( 'n','n', dim(IC), dim{IC'}, dimEta', -1., Ct',-, AB',-, 1., D',-) mais verifier rangement / convention ****************************************************************************************** ************* V e n t i l a t i o n ****************************************************** ****************************************************************************************** Le problème consiste à ranger chaque CtAB' d'une cellule dans les matrices de la famille englobante. Ces matrices sont au nombre de 4, correspondant a 4 bk Fm-|MT>, dans l'ordre : (f_f), (f_x), (x_f), (x_x) Chacune est structurée par les interfaces (IN,IX). On va donc utiliser cette structure, qui est également connue pour les CtAB', pour le rangement/ventilation; un bloc => un bk MX, les MX d'une rangée chaînés sous un bk MXR de MXT. Les interfaces sont numerotées dans la famille, mais il y a des blocs INixINj vides; on a donc besoin d'une numérotation des blocs non vides vus de la cellules, et d'une table de passage de cette numérotation à celle de la famille. De plus, les colonnes de CtAB' sont structurées en IC', cad les composantes des Tr, avec possible répétition, constituant les TV connectant la cellule à son environnement. Il faut donc une table donnant la position des colonnes de IC' dans le bloc IN.IN d'arrivée. (ou IN.IX etc, on explicite seulement le rangement dans la première matrice (f_f) de la Fm) Sous la famille, à l'élimination d'une cellule : ! boucles dans la structure par blocs loop on : Blignes de CtAB' < ! identification du MXR cible (une Bligne <-o-> une IN) passage # IN{Cl} bloc de CtAB' a # IN{Fm}<-o->MXR Table loop on Blocs de la Bligne < id du MX bk cible Table ! boucles sur les composantes scalaires loop on : lignes d'un bloc INj x INi < passage # ligne CtAB' a IN.IN Table loop on composantes < passage # col CtAB' a IN.IN Table copie > > > > Fc 1 Fc2 Fc3 Fc1/Cl IC1' IC2' IC3' IC4' IC5'... IC1 | IC2 I - - - - - I - - - - - I - - - - X | | |colonne m .IC1 , , I | | | . Fc1 . , , I | | | . . , , I | | | . .IC2 , I | | | . I - - - - - I - - - - - I - - - - X ( Table ICi -> INj ) . .IC3 , , I | | | . . , , I | | | . Fc2 .IC4 , Cl2 , I | | | . . , , I | | | . . , , I // | | . I - - - - - I - - - - - I - - - - X //| V | . .IC5 , , I // V Fci/Fm V . Fc3 . , , Cl3 I //IN1 IN2 IN3 . . , , I // . . . . , , I // . . V 2 BRows : [ff] et [fx] X X X X X X I X X X X X I X X X X X / - |- - -.- - - - . - - - - - -CDXTB(1)=1 // I . . n I (2)= // I . . I (3)=(LCL).Nb_St_Var IC1 ----------------------------- //>IN1I . . I (4)=nFc // I . . . . . . . ... . . . . .I +1 =(Fc).IC_Nb // I . . I +2 =0 IN2I . . I +3 =(Fc).Nb_Var I . . I I . . . . . . . . . . . . . .I I . . I IC2 -------------------------------- >IN3I . . I ligne k..........................>l I . . I I . . I - - - - - - - - - - - - - - - La même table sert à passer de la numérotation interne à la Cl (ICi) à celle des INj IXj de la Fm, par ligne ou par colonnes blocs. Par contre, les colonnes ne comportant pas les T-Probes, il faut deux tables scalaires de passage. ****************************************************************************************** ************* A n a l y s e ************************************************************* ****************************************************************************************** Par rapport aux objectifs, on a éliminé les lignes de zéros de la ABt_TV stokée; après l'extraction, le produit matriciel est standard (plus de pairing banks); enfin, la ventilation fait appel à des tables fixes et échappe ainsi à la création à chaque calcul des cross reference tables, abandonnant ainsi leur encription salace, voire dévergondée (banks CTX,CTXB,CTXE). Les tables de rangement permettent l'existence de Tr ou IC nons consécutifs sous une IN (ou IX), et Le Bug n'a plus l'occasion de s'exprimer. Dans les traitements ci-dessus, on n'a pas envisagé les cas particuliers, comme les matrices compactées (Ct_TV_SV et ABt_SV_TV); en ajoutant dans les boucles intérieures l'exploration de la sous-structure IC/Cx/TV des IN, on peut exploiter sans changement de méthode ces cas particuliers, tenir compte des composantes bien rangées etc. Le stokage de la matrice D pouttait suivre les memes conventions : une D_TV de dim {IC'}x{IC} sous chaque IC; il suffirait de botteler(*) pour obtenir D' de dim identique au résultat de CtAB'; on effecturait alors la somme D'+CtAB'dans la partie "operation". (*) botteler (des radis) : en Anglais "to bunch"; "to bunch one's skirt" : retrousser sa jupe.