Extensions d`OpenMP pour les Architectures a Hi
Transcription
Extensions d`OpenMP pour les Architectures a Hi
RENPAR/CFSE/SYMPA Paris, cite des sciences et de l'industrie, 24 { 27 avril 2001 Extensions d'OpenMP pour les Architectures a Hierarchie Memoire Multiple Fr ed eric Br egier, Barbara Chapman, Amit Patil, Achal Prabhakar University of Houston, Computer Science Department, Philip. G. Homan Hall, 4800 Calhoun Street, Houston Texas, 77204-34775 - USA [email protected], [email protected] Resume Dans cet article, nous pr esentons des exp erimentations portant sur un ensemble de programmes repr esentatifs de probl emes rencontr es lors de la programmation avec le langage OpenMP d'architectures du type NUMA, architectures a m emoire distribu ee et grappes de noeuds a m emoire partag ee (architectures a hi erarchie m emoire multiple). Nous y soulignons l'importance pour la performance de prendre en compte la localit e des donn ees a l'aide du concept de privatisation des donn ees. Comme l' ecriture a l'aide de ce concept de tels codes en OpenMP n'est pas ais e, nous proposons e galement un ensemble d'extensions a OpenMP utilisant essentiellement le concept de distribution en s'inspirant de HPF. Nos exp erimentations portent sur deux types d'architectures, une machine cc-NUMA avec un SGI Origin 2000, et une architecture a m emoire distribu ee avec un IBM SP2 en utilisant une approche de m emoire partag ee r epartie logicielle avec la biblioth eque TreadMarks. Mots-cles : OpenMP, Architecture NUMA, Memoire partagee repartie logicielle, Privatisation, HPF 1. Introduction OpenMP [3] propose un standard pour la programmation parall ele d'architectures a m emoire partag ee. Il propose une approche relativement simple pour cr eer des codes parall eles, permettant en particulier un d eveloppement incr emental de codes parall eles depuis des codes s equentiels existants. Mais il est extr^ emement dicile de construire des syst emes a m emoire r eellement partag ee de taille quelconque. Ainsi les syst emes actuels peuvent avoir 16 processeurs connect es a la m emoire partag ee, et des syst emes a 32 processeurs devraient bient^ ot e ^ tre disponibles. Leur bus partag e entre les processeurs et la m emoire repr esente une r eelle limitation. Pour solution, certains constructeurs proposent des machines constitu ees d'un certain nombre de noeuds, chacun ayant sa propre m emoire partag ee interne ; ces noeuds sont connect es de facon a cr eer une plate-forme extensible avec un acc es a la m emoire non uniforme (NUMA). Si un tel syst eme a un espace d'adressage global et si le mat eriel supporte une coh erence de cache sur l'ensemble de la machine, OpenMP peut e ^ tre impl ement e sur ce syst eme. De plus, il y a un int er^ et croissant a programmer des machines a m emoire partag ee en grappes, ou m^ eme des machines a m emoire distribu ee comme un simple super-calculateur en utilisant par exemple un syst eme de m emoire partag ee r epartie par support logiciel (SDSM en anglais). Cependant, OpenMP n'a aucun dispositif pour supporter l'optimisation des codes sur des syst emes NUMA, et il n'est pas non plus un bon candidat comme mod ele de programmation pour de tels syst emes NUMA e tendus, puisqu'il ne peut pas s' etendre au-del a d'un espace d'adressage unique. Dans la suite, nous pr esentons d'abord un ensemble d'extensions a OpenMP (section 2) qui est destin e a am eliorer l'ex ecution sur des syst emes NUMA et qui pourrait e galement e ^ tre mis en application a travers un syst eme a m emoire distribu ee (par l'interm ediaire de SDSM ou de techniques de compilation emprunt ees a HPF [8]). Ces extensions utilisent principalement le concept de la privatisation de donn ees. Nous pr esentons des exp eriences montrant l'int er^ et de cette approche sur deux architectures (section 3), une machine cc-NUMA avec un Origin 2000 de SGI, et une machine a m emoire distribu ee avec un IBM SP2 en utilisant une approche SDSM avec TreadMarks [13, 1]. Ces exp eriences (section 4) sont repr esentatives de probl emes li es a la programmation d'architecture a hi erarchie m emoire multiple. La section 5 pr esente les travaux relatifs a cette e tude. 2. Programmation d'architectures NUMA An d'^ etre ecace, le programmeur doit faire attention a la hi erarchie m emoire de l'architecture sousjacente. Ainsi, on peut e crire un programme dans un style SPMD employant la privatisation des donn ees de facon a placer toutes les donn ees dans un niveau de m emoire aussi proche que possible du processeur. Mais cette approche est dicile et exige une attention sp eciale puisque le code n'est plus li ea la version s equentielle originale, et donc dicile a maintenir, d evelopper ou d eboguer. Pour faciliter l'eort de programmeur et rester aussi pr es que possible de la version s equentielle originale, nous proposons un ensemble d'extensions a OpenMP, appel e NUMA-OMP pour produire automatiquement ces codes. Ces extensions sont principalement emprunt ees a HPF [8] et concernent le placement des donn ees et l'acc es local aux donn ees. Nous proposons d'abord une directive DISTRIBUTE avec trois formats, ?, BLOCK et CYCLIC. Elle sp ecie comment les donn ees sont plac ees (privatis ees) sur les m emoires des processeurs. La directive ON HOME permet, via le placement de la donn ee sp eci ee dans la directive, d'indiquer quel thread doit ex ecuter le bloc d'instructions qui suit. Nous proposons aussi d'employer la directive SHADOW pour sp ecier quelles parties des tableaux distribu es vont e ^ tre acc ed ees non localement fr equemment. L'utilisation de cette directive permet au compilateur d'allouer un stockage compl ementaire, des zones de recouvrement sur chaque processeur, an de permettre un acc es local aux donn ees voisines distantes. ce jour, toutes nos exp A eriences sont faites a l'aide de codes produits a la main, mais nous projetons d'obtenir directement ces codes en employant plus tard notre compilateur d' etude. Nous emploierons alors la sentinelle !$NMP pour indiquer les directives NUMA-OMP, comme suit ( a droite un pseudo code indiquant l' ecriture manuelle) : real A(M,N), B(M,N) !$NMP DISTRIBUTE B(*,BLOCK) !$NMP DISTRIBUTE A(*,BLOCK) !$NMP SHADOW A(0,1) ! NOT = nombre de threads real A(M,0:N/NOT+1), B(M,N/NOT) !$OMP PARALLEL DO !$NMP ON HOME (A(:,I)) DO I = 1, N B(:,I) = A(:,I-1) + A(:,I) + A(:,I+1) END DO !$OMP END PARALLEL !$OMP PARALLEL DO I = 1, N/NOT B(:,I) = A(:,I-1) + A(:,I) + A(:,I+1) END DO !$OMP END PARALLEL 3. Architectures utilisees Nous avons employ e deux sortes d'architectures : d'une part une architecture cc-NUMA avec un SGI Origin 2000 et d'autre part un syst eme a m emoire distribu ee combin ea un SDSM avec un IBM SP2. 3.1. Architecture cc-NUMA Le mod ele de programmation a m emoire partag ee d evelopp e pour les SMPs (Symmetric Multi-Processor) s'est av er e tr es populaire, cependant les SMPs purs ne peuvent pas atteindre de grande taille en raison du bus partag e entre les processeurs et la m emoire. Pour r esoudre cela, les constructeurs ont concu des syst emes divis es dans des modules plus petits. Chaque noeud est un SMP pur avec un r eseau haut d ebit connectant tous les noeuds. De tels syst emes ont un espace d'adressage m emoire global et le mod ele de programmation a m emoire partag ee s'applique. Ces machines sont aussi appel ees des machines NUMA a cause de la non-uniformit e dans les temps d'acc es a la m emoire distante et locale [19]. Les syst emes qui fournissent la coh erence de cache sont appel es cc-NUMA. Des exemples commerciaux incluent l'Origin 2000 de SGI et les AplhaServer GS80, GS106 et GS320 de Compaq. 2 L'Origin 2000 est constitu e d'un r eseau hypercube reliant chaque noeud (Fig. 1). Un noeud comporte deux processeurs MIPS R12000, avec une portion de la m emoire partag ee. Chaque MIPS R12000 a deux niveaux de cache associatifs. Le premier niveau de cache poss ede 32Ko pour les donn ees et 32Ko pour les instructions. Le second niveau de cache poss ede en g en eral 4Mo avec une taille de ligne de 128 octets. Tous les caches utilisent l'algorithme du moins recemment utilise (LRU), chaque noeud contiennent au plus 4Go de m emoire et est connect ea une portion du syst eme d'entr ee-sortie. Node 0 Proc A Proc B Cache Cache Node 1 Mem & Dir Hub Node N IO Xbar IO Ctrls Scalable Interconnect Network Figure 1. Architecture de l'Origin 2000 de SGI Le mod ele de programmation a m emoire partag ee assume des temps d'acc es uniformes pour l'espace d'adressage entier. L'assimilation des machines NUMA au mod ele SMP peut ne pas amener des performances optimales en raison de propri et es de localit e spatiale inadapt ees. N eanmoins, les syst emes NUMA peuvent d elivrer cette haute performance pour des applications bas ees sur la m emoire partag ee si le placement des donn ees est local au processeur sur lequel le calcul est ex ecut e. OpenMP lui-m^ eme ne fournit pas de facilit e pour le placement des donn ees, n eanmoins on s'attend sur des machines NUMA a ce que la localit e des donn ees augmentant, les performances pour les applications OpenMP augmentent elles aussi. Comme SGI e tait conscient des probl emes de localit e des donn ees sur une machine NUMA, ils ont propos e [10] plusieurs facons de distribuer les donn ees (et les calculs en fonction des donn ees), en employant une politique de premier contact (\First Touch", le premier processeur acc edant a un e l ement d'une page se verra attribuer cette page dans sa m emoire locale) ou l'utilisation explicite de directives de distribution. Bien que distribu es, il faut noter que les tableaux demeurent toujours partag es via le support fourni par le syst eme d'exploitation. La clause AFFINITY permet d'indiquer, tout comme la directive ON HOME, le thread associ ea chaque it eration. Selon la documentation SGI, aucune distribution (First Touch) et la directive DISTRIBUTE sont presque semblables. La seule di e rence est que la distribution via DISTRIBUTE est faite a la compilation alors que le First Touch a lieu a l'ex ecution. Par d efaut, le compilateur OpenMP de SGI utilise le First Touch [5]. Bien s^ ur, il faut tenir compte de ce premier acc es pour distribuer correctement les donn ees (et donc eectuer le premier acc es dans une r egion parall ele, sinon le processeur 0 poss edera l'ensemble des pages associ ees aux donn ees). La directive DISTRIBUTE de SGI distribue a la HPF les tableaux, mais elle emploie une distribution bas ee sur la pagination de la m emoire (bas ee sur la taille d'une page). La directive DISTRIBUTE RESHAPE emploie une autre facon de distribuer un tableau, en se basant sur les e l ements et non sur les pages. De ce fait, les tableaux sont r eorganis es et l'arithm etique des pointeurs est employ ee pour acc eder a un e l ement. Cette facon de faire est tr es semblable a la version que nous avons produite a la main, except e que le tableau reste toujours partag e parmi les processeurs. Nous avons donc mis en oeuvre pour chaque exemple 4 versions, une Sans Distribution, une avec un la main appel e Private. DISTRIBUTE, une avec un DISTRIBUTE RESHAPE et nalement une produite a Cette derni ere est semblable au style de programmation SPMD. Les tableaux sont distribu es sur l'ensemble 3 des processeurs et d eclar es priv es. Nous employons chaque fois un buer partag e de petite taille pour r ealiser les communications entre les threads. Ainsi les calculs de chaque thread portent uniquement sur les parties priv ees des tableaux et le partage est r ealis e a travers ces petits buers partag es. La privatisation assure que les donn ees \suppos ees locales" seront eectivement allou ees dans la m emoire locale du noeud o u se situe le processeur, contrairement aux directives de distribution ou au First Touch, o u le syst eme de gestion de la m emoire partag ee ne peut assurer qu' a chaque ex ecution la m emoire allou ee sera r eellement locale au processeur : dans un environnement multi-utilisateurs, la m emoire du noeud peut e ^ tre utilis ee par d'autres processus tournant sur des noeuds voisins, impliquant alors que la m emoire associ ee au programme s'ex ecutant sur ce noeud soit en fait allou ee sur un noeud distant. Une autre possibilit e est d'utiliser la migration automatique des pages propos ee par le syst eme d'exploitation de l'Origin 2000, o u les donn ees acc ed ees de mani ere distante peuvent e ^ tre, de mani ere transparente, migr ees sur une m emoire proche du processeur qui l'a r ef e renc ee. Mais nous avons rencontr e de nombreux probl emes dans la pratique avec cette technique, avec des performances toujours tr es inf e rieures a ce que nous obtenons en interdisant cette migration automatique. Les exp eriences ont e t e conduites sur l'Origin 2000 de SGI au NCSA. La conguration actuelle du NCSA consiste en une machine de 48 processeurs nomm ee modi4, et de 11 autres de 64 a 256 processeurs. modi4 est disponible pour l'acc es interactif, tandis que les autres machines sont utilis ees via la soumission de jobs. Chaque machine est homog ene, mais pr esentent des di e rences : le type de processeur varie de 195MHz R10000 a 250MHz R10000 et la m emoire globale varie entre 16 et 128 Go. Sur toutes ces machines, le niveau 1 de cache pour les donn ees et les instructions sont tous les deux de 32 Ko, tandis que le niveau 2 de cache est de 4 Mo. Toutes nos exp eriences ont e t e conduites dans un mode multi-utilisateurs. Nous avons employ e le compilateur MIPSPRO 7 Fortran 90 de SGI avec les options -mp -Ofast. 3.2. Memoire partagee repartie par support logiciel Les syst emes dans lesquels la coh erence de la m emoire est g er ee par un logiciel sont a l'autre bout du spectre des architectures a m emoire partag ee. De telles machines consistent g en eralement en un certain nombre de processeurs reli es par un r eseau rapide, o u toutes les m emoires sont physiquement distribu ees avec une couche logicielle imitant un espace d'adressage global. Les caract eristiques de telles machines sont semblables au cc-NUMA. Pour obtenir de bonnes performances, il est imp erieux que l'acc es aux donn ees soit local au processeur ex ecutant le calcul. La non-uniformit e dans l'acc es a la m emoire est plus marqu ee avec les SDSM que dans les machines cc-NUMA. Ainsi, la localisation des donn ees devrait avoir un eet beaucoup plus prononc e. Nous avons employ e le syst eme SDSM TreadMarks. TreadMarks est bas e sur le protocole de coh erence paresseux [12] et le protocole d' ecrivains multiples pour r eduire l'eet de faux partage. Nous mettons en oeuvre pour chaque exemple deux versions, une partag ee, une priv ee. La m emoire est par d efaut priv ee dans TreadMarks et seule la m emoire allou ee explicitement a l'aide d'appels a la biblioth eque est partag ee [16]. Pour la version partag ee, l'ensemble du tableau est d eclar e partag e. La version priv ee n'alloue qu'un buer n ecessaire pour permettre la mise a jour de la zone de recouvrement (ou shadow) (Jacobi en section 4.1 et LBE en section 4.2) ou la diusion de la colonne normalis ee (LU en section 4.3). Ainsi, tous les calculs emploient des donn ees priv ees. Ces codes SPMD avec TreadMarks sont tr es proches des codes SPMD e crit pour les versions priv ees d'OpenMP sur l'Origin 2000. Les exp eriences ont e t e r ealis ees sur le SP2 d'IBM situ ea l'Universit e de Houston. Ce syst eme comporte 64 noeuds assembl e en 5 parties dont 48 noeuds ns - des P2SC (Power2 Superchip) a 120MHz - avec une m emoire de 128 Mo. Toutes les exp eriences ont e t e faites sur ces noeuds ns, dans un mode non-d edi e. Tous les noeuds utilisent le syst eme IBM AIX 4.3. Le compilateur C d'IBM C version 3.6.6 a e t e utilis e pour tous les programmes qui ont e t e li es avec la version 1.0.3.3-BETA de la biblioth eque TreadMarks. Les options de compilation suivantes ont e t e utilis ees : -O3 -qstrict -qarch=pwr2 -qtune=pwr2 . 4. Programmes utilises Nous avons e valu e les performances de notre approche sur des noyaux typiques a savoir Jacobi, la factorisation LU et l' equation de Boltzmann. Les acc el erations (speedups) sont entendus par rapport au 4 temps de la version s equentielle pour chaque noyau. 4.1. Jacobi Jacobi est une m ethode courante pour r esoudre des e quations di e rentielles partielles. L'algorithme de Jacobi poss ede une localit e spatiale excellente (Programme 1 et Figure 2(a)). Tous les acc es aux donn ees peuvent e ^ tre rendus locaux except es pour les e l ements a la fronti ere acc ed es en lecture partag ee. Ainsi, c'est un exemple typique o u des architectures NUMA peuvent obtenir une bonne performance puisque l'acc es partag e est en lecture seule et de plus sur une faible portion des donn ees. (a) (b) (c) Figure 2. Schemas des acces pour Jacobi (a), LBE (b) et LU (c) !$OMP PARALLEL DO do j = 1,n do i = 1,n A(i,j) = (B(i-1,j)+B(i+1,j)+B(i,j-1)+B(i,j+1)) * c end do end do !$OMP END PARALLEL Programme 1. Noyau du Jacobi !$SGI DISTRIBUTE A(*,block), B(*,block) !$OMP PARALLEL DO do j = 1,n do i = 1,n A(i,j) = (B(i-1,j)+B(i+1,j)+B(i,j-1)+B(i,j+1)) * c end do end do !$OMP END PARALLEL DO Programme 2. Noyau du Jacobi avec DISTRIBUTE Une distribution BLOCK dans la deuxi eme dimension des deux tableaux A et B permet d'obtenir une bonne localit e et un bon e quilibrage de charge. Dans la version priv ee, nous avons employ e une zone shadow pour avoir acc es aux e l ements situ es a la fronti ere. Le partage des donn ees le long de la fronti ere est r ealis e via 2 buers partag es de la taille d'une colonne par processeur, a part pour les processeurs 0 et N-1 qui ont un seul buer partag e. Ainsi le tableau eectivement partag e utilis e pour impl ementer ces buers est de taille (2*N-2) * taille d'une colonne, ou 'N' est le nombre de processeurs. 5 !$SGI DISTRIBUTE_RESHAPE A(*,block), B(*,block) !$OMP PARALLEL DO do j = 1,n do i = 1,n A(i,j) = (B(i-1,j)+B(i+1,j)+B(i,j-1)+B(i,j+1)) * c end do end do !$OMP END PARALLEL DO Programme 3. Noyau du Jacobi avec DISTRIBUTE RESHAPE !$OMP PARALLEL SHARED(buflower,bufupper,chunk) & !$OMP PRIVATE(A,B,thdno,noofthds,start_x,end_x,start_y,end_y,i,j,k) ....... ....... do k = 1, ITER bufupper(1:n,thdno) = A(1:n,chunk) buflower(1:n,thdno) = B(1:n,1) !$OMP BARRIER B(1:n,0) = bufupper(1:n,thdno-1) B(1:n,chunk+1) = buflower(1:n,thdno+1) do j = start_y, end_y do i = start_x, end_x A(i, j) = (B(i-1, j) + B(i+1, j) + B(i, j-1) + B(i,j+1)) * c enddo enddo do j = start_y, end_y B(1:n, j) = A(1:n, j) enddo enddo !$OMP END PARALLEL Programme 4. Noyau du Jacobi en style SPMD Nous pouvons voir dans la Fig. 3 le sch ema des mouvements des donn ees durant l'ex ecution du Jacobi : les threads copient d'abord leurs zones fronti eres de facon a acc eder aux valeurs r ecentes dans leur zones shadow. Le reste du programme s'eectue alors uniquement sur des donn ees locales. Nous montrons tout d'abord les r esultats obtenus avec la migration automatique des pages autoris ee (Fig. 3). Nous observons que nous obtenons une acc el eration quasi lin eaire avec moins de 8 threads, mais apr es, le rendement s'eondre car des pages sont migr ees (et ce sur une distance d'autant plus grande que le nombre de threads est e lev e, traversant parfois plus de 2 hubs), pr esentant m^ eme certainement des eets de ping-pong des pages associ ees au fronti ere des donn ees distribu ees. Ces migrations de pages entra^nent une d egradation des performances (si l'on compare aux versions sans migration en Fig. 4). Aussi, pour le reste des exp erimentations, nous n'autoriserons pas de migration automatique. Sur l'Origin 2000, comme un processeur lit essentiellement des donn ees locales, a l'exception d'une ligne provenant des processeurs voisins, les rendements(speedups) observ es sont lin eaires (et m^ eme superlin eaires) (Fig. 4(a)). Le \First Touch" et DISTRIBUTE montrent une ecacit e comparable puisque, dans cet exemple, la pagination est la m^ eme apr es la phase d'initialisation. L' ecart observ e a partir de 4 processeurs est d^ u justement a cette initialisation o u le syst eme d'exploitation d eplace les pages selon la politique du \First Touch", tandis que dans la version DISTRIBUTE, ce placement est r ealis e lors de la eger surco^ ut certainement compilation. Le DISTRIBUTE RESHAPE est comparable au DISTRIBUTE avec un l 6 Jacobi Speedups with Page Migration on SGI 9 0 1 2 8 3 No Distribution Distribute(*,Block) 7 Distribute_Resha− pe(*,Block) Speedup 6 5 4 3 2 1 0 Private Array Shadow Rows Shared Buffers 1 2 4 8 16 32 Number of Threads Figure 3. Schema d'execution pour le Jacobi SPMD et acceleration avec Migration automatique des pages d^ ua l'arithm etique des pointeurs utilis ee pour acc eder aux e l ements. La version Privee montre des acc el erations super-lin eaires (75 pour 64 processeurs), principalement en raison de la privatisation des donn ees qui impliquent un meilleur eet de cache (niveaux 1 et 2) et de la moindre intrusion du syst eme d'exploitation dans la gestion des variables partag ees, puisqu'elles ne sont uniquement employ ees que pour mettre a jour les zones shadow apr es chaque it eration du Jacobi, et non pas durant les calculs. Ces mises a jours sont donc vectoris ees, d'o u ces meilleures performances. Avec plus de processeurs (jusqu' a 128), nous observons toujours une grande ecacit e, mais qui n'est plus lin eaire car il n'y a plus assez de calcul pour chaque processeur pour une matrice de taille 1024 × 1024 . 80 Jacobi sur IBM SP2/TreadMarks (1024x1024) 6 Jacobi Speedups on SGI 2000 5 70 Shared No Distribute Private Distribute 60 Distribute Reshape 4 Speedup Speedup Private 50 40 30 3 2 20 1 10 0 0 1 2 4 8 16 1 32 Number of Threads 2 4 8 Nb de Processeurs 16 32 (a) (b) Figure 4. Acceleration du Jacobi sur SGI O2000 (a) et IBM SP2 (b) (1024 × 1024 en double precision) Avec TreadMarks sur IBM SP2, les performances pour la version avec un tableau partag e sont tr es faibles et ce d es 2 processeurs (Fig. 4(b)). En fait, nous remarquons un fort ralentissement avec plus de 8 processeurs. Pour le cas priv e, nous obtenons une acc el eration quasi lin eaire jusqu' a 16 processeurs. Avec 32 processeurs, la courbe s'aaisse. Le faible rendement pour la version partag ee est attribu e au co^ ut e lev e induit par le maintient de la coh erence sur un grand nombre de pages partag ees, contrairement a la version priv ee qui poss ede un nombre plus faible de pages partag ees (seulement un buer). 4.2. Equation de Boltzmann LBE est un code de dynamique des uides qui r esout l' equation de Boltzmann (Lattice Boltzmann Equation, LBE [9]). L'algorithme est semblable a Jacobi avec un sch ema d'acc es en e toile except e que les e l ements voisins sont mis a jour et non pas lus (Fig. 2(b)). Ainsi c'est un cas d'acc es partag e en e criture plut^ ot qu'en lecture, soit un fort potentiel de prendre en d efaut le fonctionnement de la m emoire partag ee. En eet, 7 il est possible d'avoir de multiples lectures sur la m^ eme ligne de cache (ou page), mais pas de multiples e critures. C'est donc un bon exemple pour analyser une faiblesse des architectures NUMA. !$OMP PARALLEL do iter = 1, niters Calculate_ux_uy_p Collision_advection_interior Collision_advection_boundary end do !$OMP END PARALLEL Collision_advection_interior: !$OMP DO do j = 2, Ygrid-1 do i = 2, Xgrid-1 f(i,0,j) = Fn(fold(i,0,j)) f(i+1,1,j) = Fn(fold(i,1,j)) f(i,2,j+1) = Fn(fold(i,2,j)) f(i-1,3,j) = Fn(fold(i,3,j)) ..... f(i+1,8,j-1) = Fn(fold(i,8,j) end do end do !$OMP END DO Programme 5. Algorithme LBE et noyau de Collision advection interior !$SGI DISTRIBUTE ux(*,BLOCK),uy(*,BLOCK),p(*,BLOCK),f(*,*,BLOCK),fold(*,*,BLOCK) !$OMP PARALLEL do iter = 1, niters Calculate_ux_uy_p Collision_advection_interior Collision_advection_boundary end do !$OMP END PARALLEL Programme 6. Noyau de LBE avec DISTRIBUTE !$SGI DISTRIBUTE_RESHAPE ux(*,BLOCK),uy(*,BLOCK),p(*,BLOCK),f(*,*,BLOCK),fold(*,*,BLOCK) !$OMP PARALLEL do iter = 1, niters Calculate_ux_uy_p Collision_advection_interior Collision_advection_boundary end do !$OMP END PARALLEL Programme 7. Noyau de LBE avec DISTRIBUTE RESHAPE Collision advection interior (Prog. 2) est le seul sous-programme de LBE qui poss ede un acc es partag e aux donn ees. Les matrices sont distribu ees par BLOCK dans la derni ere dimension pour assurer de nouveau une bonne localit e et un bon e quilibrage de charge. Dans la version priv ee, nous avons employ e une zone shadow pour avoir acc es aux e l ements voisins et un buer partag e de la taille de ces fronti eres (comme dans Jacobi) pour la mise a jour distante. Sur l'Origin 2000, nous pouvons voir cette fois que toutes les versions employant l'extension SGI d'OpenMP ou le \First Touch" ont des r esultats quasi identiques, avec un l eger avantage pour DISTRIBUTE RESHAPE (Fig. 5(a)). Cette fois, les rendements sont sous-lin eaires, car chaque processeur doit acc eder a la m emoire du voisin en e criture, contrairement a Jacobi. Ce partage en e criture prend en d efaut le support du syst eme d'exploitation pour la m emoire partag ee, avec un eet de ping-pong des lignes de cache associ ees. L'architecture cc-NUMA peut e galement e ^ tre rendue responsable, car, pour 16 ou 32 processeurs, l'acc es a une donn ee non-locale peut se faire en traversant 2 noeuds, obtenant donc de plus long temps d'acc es. La version Privee de LBE montre une am elioration notable de l'acc el eration pour 16 et 32 processeurs. D'une part, il y a une augmentation de la localit e des donn ees (eet de cache) et d'autre part la synchronisation est faite seulement a la n de chaque it eration. Tous les processeurs font donc leur calcul 8 LBE sur SGI Origin 2000 (256x256) 35 LBE sur IBM SP2/TreadMarks (256x256) 4.5 33 No Distribution 30 3.5 Hand Translated(*,Block) Speedup 23 Shared Private Distribute_Resha− pe(*,Block) 25 Speedup 4 Distribute(*,Block) 28 20 18 15 3 2.5 13 10 2 8 5 1.5 3 0 1 2 4 8 16 1 32 1 2 Nb de Threads OpenMP 4 8 16 32 Nb de Processeurs (a) Figure 5. Acceleration de LBE sur SGI O2000 (a) et IBM SP2 (b) (256 × 256) (b) seulement sur des donn ees priv ees jusqu' a la n de l'it eration (vectorisation des messages). Avec TreadMarks sur IBM SP2, nous observons une moindre am elioration de la version priv ee compar ee a la version partag ee (Fig. 5(b)). Les deux versions ont des acc el erations raisonnables (3.5 sur 16 processeurs pour la version partag ee, 4.5 pour la version priv ee) puisque la quantit e de m emoire partag ee n'est pas trop importante, d'o u un co^ ut faible pour le maintien de la coh erence sur les processeurs. N eanmoins la privatisation permet d'obtenir une meilleure ecacit e puisque le nombre de pages maintenues y est moindre que dans la version partag ee (seuls les buers sont partag es). Avec plus de 16 processeurs, les ecacit es diminuent en raison d'un manque de calculs par rapport aux communications requises. 4.3. Factorisation LU La factorisation LU (Progr. 8) est souvent employ ee comme une partie d'une r esolution de syst eme. Elle factorise la matrice en deux sous matrices, triangulaires sup erieure et inf e rieure. !$OMP PARALLEL do k = 1,n-1 !$OMP SINGLE lu(k+1:n,k) = lu(k+1:n,k)/lu(k,k) !$OMP END SINGLE !$OMP DO do j = k+1, n lu(k+1:n,j) = lu(k+1:n,j) - lu(k,j) * lu(k+1:n,k) end do !$OMP END DO end do !$OMP END PARALLEL Programme 8. Factorisation LU Semblable a Jacobi, il n'y a que des acc es partag es en lecture et seule la colonne courante normalis ee est concern ee (Fig. 2(c)). Mais pour e ^ tre ecace, tous les threads doivent participer a la mise a jour presque jusqu' a la n. D'ou, pour un bon e quilibrage de charge, une distribution CYCLIC sur la deuxi eme dimension est n ecessaire. C'est un bon exemple o u la norme OpenMP n'a aucune r eponse pour un besoin si sp ecique et montre donc un int er^ et fort de la capacit ea sp ecier la distribution des donn ees et donc la distribution des calculs associ es. Dans la version priv ee, nous employons seulement un tableau partag e de la taille d'une colonne an de rendre accessible la colonne normalis ee a tous les processeurs. Sur l'Origin 2000, toutes les versions, apr es 16 processeurs (Fig. 7(a)), ont un rendement sous-lin eaire en raison, principalement, du manque de travail sur chaque processeur (ratio calculs/communications e lev e). Si nous consid erons la version OpenMP sans distribution, son mauvais rendement est d^ ua une mauvaise 9 !$SGI DISTRIBUTE lu(*,CYCLIC) !$OMP PARALLEL do k = 1,n-1 !$OMP SINGLE lu(k+1:n,k) = lu(k+1:n,k)/lu(k,k) !$OMP END SINGLE !$OMP DO do j = k+1, n lu(k+1:n,j) = lu(k+1:n,j) - lu(k,j) * lu(k+1:n,k) end do !$OMP END DO end do !$OMP END PARALLEL Programme 9. LU avec DISTRIBUTE !$SGI DISTRIBUTE_RESHAPE lu(*,CYCLIC) !$OMP PARALLEL do k = 1,n-1 !$OMP SINGLE lu(k+1:n,k) = lu(k+1:n,k)/lu(k,k) !$OMP END SINGLE !$OMP DO do j = k+1, n lu(k+1:n,j) = lu(k+1:n,j) - lu(k,j) * lu(k+1:n,k) end do !$OMP END DO end do !$OMP END PARALLEL Programme 10. LU avec DISTRIBUTE RESHAPE r epartition sur les 32 processeurs. En eet, par d efaut, la r epartition initiale (r esultant du \First Touch") ressemblera a une distribution BLOCK qui n'est pas appropri ee pour pour l' equilibrage de charge avec LU. Les versions DISTRIBUTE et DISTRIBUTE RESHAPE sont donc meilleures car la distribution re ete le besoin pour l' equilibrage de charge. Dans la version Privee, la seule partie pr esentant une synchronisation entre les processeurs est lorsque chaque processeur recopie "la colonne normalis ee partag ee" dans son buer priv e. Le reste du calcul est alors parfaitement parall ele o u chaque processeur fait ses calculs sur ses propres donn ees sans aucune donn ee partag ee. Le rendement super-lin eaire vient de nouveau de la privatisation des donn ees, visant a la fois a un meilleur eet de cache et a une vectorisation des mises a jour des buers partag es. Avec TreadMarks sur IBM SP2, pour la version partag ee, nous remarquons de faibles acc el erations jusqu' a 16 processeurs maximum (Fig. 7(b)), sup erieures a celles obtenues avec Jacobi, principalement en raison du fait que, dans LU, seule une colonne par it eration est acc ed ee de mani ere partag ee. De l a, le nombre de pages a mettre a jour est moindre que dans Jacobi (2*N - 2 lignes par it eration). Pour la version Privee, nous remarquons des acc el erations quasi lin eaires jusqu' a 8 processeurs. Au-del a, la baisse de rendement peut e ^ tre attribu ee a la facon dont, dans LU, comme l'ex ecution progresse, la quantit e de calcul a r ealiser par it eration diminue. Cet eet est d'autant plus marqu e que le nombre de processeurs est grand, d'ou le surco^ ut d^ ua la synchronisation prend le pas sur les calculs. 4.4. Resume des experimentations sur les deux plate-formes Sur l'Origin 2000 de SGI, nous avons observ e que prendre soin de la distribution des donn ees (et des calculs selon les donn ees) peut radicalement augmenter l'ecacit e des applications, et ce, m^ eme si l'on admet que la machine poss ede un syst eme de m emoire partag ee ecace. L'architecture cc-NUMA est responsable de ce r esultat. Nous observons par exemple que le \First Touch" n'est pas toujours susant pour obtenir une bonne ecacit e, comme avec l'application LU. Nous observons aussi que la privatisation des tableaux (en les placant explicitement sur la m emoire locale de chaque processeur) permet de meilleurs rendements, voire m^ eme super-lin eaire. Ceci est 10 K 0 1 3 2 Private Array Shared Buffer Private Buffer Figure 6. Schema d'execution du LU SPMD LU Speedups on SGI Origin 2000 70 LU sur IBM SP2/TreadMarks (2048x2048) 5.0 4.5 60 Distribute(*,cyclic) 4.0 Distribute_Resha− pe(*,cyclic) 3.5 Speedup 50 Speedup Shared No Distribution Hand Translated(*,cyclic) 40 30 Private 3.0 2.5 20 2.0 10 1.5 1.0 0 1 2 4 8 16 32 1 2 Number of Threads 4 8 16 32 Nb de Processeurs (a) Figure 7. Acceleration pour LU sur SGI O2000 (a) et IBM SP2 (b) (2048 × 2048) (b) principalement d^ ua deux facteurs. D'abord, la privatisation place les donn ees dans la m emoire locale du noeud dans le syst eme SGI, donc elles sont plus proches du processeur et permettent de b en ecier des eets de caches des niveaux 1 et 2, souvent responsables d'acc el eration super-lin eaire. Deuxi emement, cette privatisation implique un style de programmation qui a tendance a placer toutes les communications a l'ext erieur des calculs, soit un processus de vectorisation des communications. Ce second eet, bien connu dans la recherche concernant HPF [8] est aussi responsable des meilleures performances. Avec la biblioth eque SDSM TreadMarks, le nombre total des pages maintenues pour les versions partag ees est beaucoup plus grand que pour les versions priv ees. Par cons equent, le surco^ ut impliqu e par le maintient de la coh erence de la m emoire partag ee pour une version partag ee est beaucoup plus grand que pour une version priv ee. De plus, pour cette derni ere, comme le nombre de pages partag ees est faible, le co^ut de marquage dans le syst eme TreadMarks est lui aussi plus bas [7]. Ce faible co^ ut est re et e par les am eliorations de rendement observ ees. En eet, la quantit e d'informations e chang ees pour la coh erence aecte aussi le temps pass e dans les barri eres et synchronisations, principalement en raison de la version centralis ee du syst eme impl ement e dans TreadMarks. Pour r ecapituler, nous observons dans les deux architectures NUMA, que ce soit cc-NUMA ou bas ee sur un SDSM, que la localit e de donn ees est un facteur important pour obtenir une bonne ecacit e. Et nous voyons que la privatisation est une facon d'obtenir ce r esultat. Cependant, l' ecriture de tels codes est dicile d'o u notre proposition d' etendre le langage an de les obtenir directement par compilation. 5. Travaux relatifs OpenMP[3] est constitu e de directives permettant de d ecrire le parall elisme de mani ere simple. Ces directives ont e t e concues pour l'ex ecution de programmes sur des machines parall eles a m emoire 11 !$OMP PARALLEL SHARED(shbuf)& !$OMP PRIVATE(lu,sumP,counter,noofthds,id,i,j,K,pribuf,Npri) DO K=1,N-1 ! Compute Column K if(mod(K-1,noofthds).eq.id) then lu(K+1:N,counter) = lu(K+1:N,counter) / lu(K,counter) !move the column K to the sharedbuffer shbuf(K+1:N) = lu(K+1:N,counter) counter = counter+1 end if !$OMP BARRIER !move the sharedbuffer to private buffer or column 0 pribuf(K+1:N) = shbuf(K+1:N) ! Update Right Part (Column J+1:N) do j = counter, Npri lu(K+1:N, j) = lu(K+1:N, j) - lu(K, j) * pribuf(K+1:N) end do END DO !$OMP END PARALLEL Programme 11. Noyau LU en style SPMD partag ee et reposent essentiellement sur la notion de boucles parall eles et de variables partag ees ou priv ees. Au contraire d'HPF[8], OpenMP ne propose aucune directive permettant d'orienter la distribution des donn ees car OpenMP consid ere un acc es uniforme de tous les processeurs a la m emoire partag ee. De nombreuses e tudes ont d ej a port e sur l'extension d'OpenMP a des architectures a acc es non uniforme a la m emoire. Certains ont consid er e des mod eles de programmation mixtes pour les grappes de noeuds SMP, utilisant a la fois MPI et OpenMP pour parall eliser les applications [20, 4]. Il est g en eralement admis que l'ecacit e de cette approche d epend fortement des propri et es sous-jacentes de l'application e tudi ee. N eanmoins, il appara^t e galement que ce style de programmation n'est pas ais e pour le programeur puisqu'il doit faire face a la programmation SMPD qu'impose MPI [6]. Nous pensons qu'il est possible avec un minimum d'extensions a OpenMP d'obtenir un langage a base de directives qui facilite la programmation et permette d'obtenir de bonnes performances sur de telles architectures. Il existe d ej a quelques impl ementations de compilateurs OpenMP d edi es pour des grappes de noeuds SMP comme le compilateur Omni OpenMP [18, 17], mais ce dernier n'inclue pas de directives de placement des donn ees et repose essentiellement sur un SDSM pour impl ementer la m emoire partag ee le long des noeuds. Dans [15], les auteurs avancent que leurs exp erimentations, incluant jusqu' a 16 processeurs, montrent qu'il n'est pas besoin de distribuer les donn ees avec OpenMP, puisque la migration des pages a l'ex ecution donne souvent les meilleures performances. N eanmoins, leurs exp erimentations montrent que de tenir compte d es le d ebut du bon placement des donn ees (en utilisant le First Touch) donne syst ematiquement les meilleurs r esultats. Nous pensons, premi erement, que ces performances devraient s'am eliorer en utilisant les directives de distribution DISTRIBUTE du compilateur OpenMP de SGI. Deuxi emement, nous pensons e galement que ces eets devraient e ^ tre plus frappant en utilisant plus de 16 processeurs, de facon a augmenter la latence m emoire moyenne, sp ecialement dans le cas d'un \false-sharing" qui introduit des eects de ping-pong sur les pages en causes. Comme nous l'avons d ej a pr esent e dans cet article, SGI a consid er e le placement des donn ees et des calculs comme e tant dans certains cas un point crucial pour obtenir de bonnes performances sur des syst emes cc-NUMA comme l'Origin 2000 [10] an de r eduire les e carts entre les temps d'acc es a la m emoire distante et locale [19]. Nos exp erimentations montrent que l'impl ementation choisie par SGI pourrait sans doute b en ecier de quelques am eliorations, notamment par la prise en compte de la directive SHADOW. Compaq, pour ses AlphaServers de type cc-NUMA, a e galement introduit des extensions inspir ees directe12 for(ck=0,k=Tmk_proc_id; ck < N-1 ;ck++) { if(ck == k) { for(j=ck+1;j<N;j++) shared->lu[j] = lu[ck/Tmk_nprocs][j] = lu[ck/Tmk_nprocs][j] / lu[ck/Tmk_nprocs][ck]; k = k + Tmk_nprocs; } Tmk_barrier(1); /* update right part. */ for(j=k;j<N;j+=Tmk_nprocs) for(i=ck+1;i<N;i++) lu[j/Tmk_nprocs][i] = lu[j/Tmk_nprocs][i] lu[j/Tmk_nprocs][ck]*shared->lu[i]; Tmk_barrier(2); } Programme 12. Factorisation LU avec TreadMarks ment de HPF dans leur compilateur OpenMP [2]. Ces extensions couvrent un plus large spectre que celles de SGI, bien que tr es semblables - notamment pour ce qui est d'une distribution bas ee sur la pagination et une autre bas ee sur les e l ements eux-m^ emes -, en introduisant e galement les alignements entre les donn ees et la possibilit e de restreindre la distribution a un sous-ensemble de processeurs. L'inconv enient de l'approche de Compaq est de proposer un langage sans doute trop riche pour pouvoir e ^ tre facilement port e sur d'autres types d'architectures, et pose donc le probl eme de la portabilit e des codes e crits pour les architectures Compaq vers d'autres architectures. Enn, Portland Group Inc. (PGI) propose e galement des extensions au langage OpenMP dans un langage nomm e Distributed OpenMP (DoMP) [14, 11]. Ces extensions concernent principalement les grappes de noeuds a m emoire partag ee, incluant aussi les cc-NUMA et les architectures a m emoire distribu ee. Ils proposent e galement les directives DISTRIBUTE et ON HOME pour distribuer les donn ees et les calculs, mais cette fois ci sur les m emoires des noeuds et non des processeurs de facon a re eter la structure de la m emoire sur les grappes de noeuds. Cette approche, di e rente des deux premi eres, utilise comme mod ele d'ex ecution celui de HPF en dehors de toute r egion PARALLEL, et a l'int erieur d'une r egion PARALLEL, celui d'un OpenMP distribu e. Pour simplier, un thread OpenMP distribu e est en fait constitu e de plusieurs threads r epartis sur les noeuds, communiquant entre eux pour assurer les acc es aux m emoires distantes. 6. Conclusion Toutes ces approches proposent diverses extensions et interpr etations an de prendre en compte l'aspect distribu e de la m emoire. Toutes ces approches sont attractives mais emp^ echent l'utilisateur de r ealiser une version portable de son code puisque chacune d'entre elles constituent des extensions propri etaires. Notre but est donc de d enir un ensemble minimum d'extensions qui seront vraiment utiles et aussi portables que possible. Nous montrons dans cet article qu'un premier sous-ensemble de directives serait constitu e des directives de distribution des donn ees (DISTRIBUTE) et des calculs en fonction des donn ees (ON HOME), mais aussi de la directive SHADOW permettant de consid erer les donn ees acc ed ees a la fronti ere de ces zones distribu ees. Les exp erimentations ont montr e que les performances e taient nettement am elior ees en utilisant une privatisation des donn ees, et ce aussi bien pour des architectures cc-NUMA tel le Origin 2000 de SGI que des architectures a m emoire partag ee r epartie logicielle comme l'IBM SP2 avec la biblioth eque de support pour une m emoire partag ee TreadMarks. D'autres e tudes sont encore n ecessaires, et notamment pour mieux prendre en compte les architectures du type grappes de noeuds a m emoire partag ee, en raison de l' ecart important entre le temps d'acc es aux donn ees locales et aux donn ees distantes via le r eseau. Les techniques utilis ees devront certainement 13 h eriter des e tudes pass ees portant sur HPF, et notamment sur les capacit es a analyser et optimiser les communications entre les noeuds. M^ eme si le compilateur s'appuie sur un support SDSM pour impl ementer le partage de la m emoire sur l'ensemble des noeuds, il demeure selon nous important de conserver la notion de localit e des donn ees de facon a limiter le surco^ ut induit par ce support. Bibliographie 1. C. Amza, A. Cox, et et al. Treadmarks : Shared memory computing on networks of workstations. IEEE Computer, 29(2) :18{28, F evrier 1996. 2. J. Bircsak, P. Craig, R. Crowel, J. Harris, C.A. Nelson, et C.D. Oner. Extending OpenMP For NUMA Machines : The Language. Dans WOMPAT 2000, Workshop on OpenMP Applications and Tools, San Diego Supercomputer Center, San Diego, California, Juillet 2000. 3. OpenMP Architecture Review Board. OpenMP Fortran Application Program Interface, Version 2.0, Novembre 2000. 4. F. Cappello et D. Etiemble. MPI versus MPI+OpenMP on IBM SP for the NAS Benchmarks. Dans SC2000, Supercomputing, Dallas, Texas, USA, Novembre 2000. 5. R. Chandra, D.K. Chen, R. Cox, D.E. Maydan, N. Nedeljkovic, et J.M. Anderso. Data Distribution Support on Distributed Shared Memory Multiprocessors. Dans Conference on Programming Language Design and Implementation, 1997. 6. B. Chapman, J. Merlin, D. Pritchard, F. Bodin, Y. Mevel, T. Sorevik, et L. Hill. Tools for Development of Programs for a Cluster of Shared Memory Multiprocessors. Dans PDPTA'99, Las Vegas, USA, 1999. 7. E. de Lara, Y.C. Hu, H. Lu, A.L. Cox, et W. Zwaenepoel. The Eect of Memory Contention on the Scalability of Page-based Software Distributed Shared Memory Systems. Dans Proceedings of Languages, Compilers, and Runtimes for Scalable Computing, Mai 2000. 8. HPF Forum. High Performance Fortran language specication, Version 2.0, Janvier 1997. 9. X. He et L. Luo. Theory of the lattice Boltzmann method : From the Boltzmann equation to the lattice Boltzmann equation. Phys. Rev. Lett. E,56(6) 6811, 1997. 10. Silicon Graphics Inc. MIPSPro Fortran 90 Commands and Directives Reference Manual. Document number 007-3696-003. Search keyword MIPSPro Fortran 90 on http ://techpubs.sgi.com/library/. 11. J. Merlin (The Portland Group, Inc.). Distributed OpenMP : Extensions to OpenMP for SMP Clusters. Dans EWOMP 2000, European Workshop on OpenMP, Edimburgh, Scotland, U.K., Septembre 2000. 12. P. Keleher, A. Cox, et W. Zwaenepoel. Lazy release consistency for software distributed shared memory. Dans 19th Annual International Symposium on Computer Architecture, pages 12{21, Mai 1992. 13. P. Keleher, S. Dwarkadas, A. Cox, et W. Zwaenepoel. Treadmarks : Distributed shared memory on standard workstations and operating systems. Dans Winter Usenix Conference, pages 115{131, Janvier 1994. 14. M. Leair, J. Merlin, S. Nakamoto, V. Schuster, et M. Wolfe. Distributed OMP - A Programming Model For SMP Clusters. Dans CPC2000, Compilers for Parallel Computers, Aussois, France, Janvier 2000. 15. D.S. Nikolopoulos, T.S. Papatheodorou, C.D. Polychronopoulos, J. Labarta, et E. Ayguad e. Is Data Distribution Necessary in OpenMP ? Dans SC2000, Supercomputing, Dallas, Texas, USA, Novembre 2000. 16. Concurrent Programming with TreadMarks. TreadMarks users Manual. http ://www.cs.rice.edu/ willy/papers/doc.ps.gz. 17. M. Sato, H. Harada, et Y. Ishikawa. OpenMP compiler for a Software Distributed Shared Memory System SCASH. Dans WOMPAT 2000, San Diego, Juillet 2000. 18. M. Sato, S. Satoh, K. Kusano, et Y. Tanaka. Design of OpenMP Compiler for an SMP Cluster. Dans EWOMP'99, European Workshop on OpenMP, pages 32{39, Lund, Sweden, Septembre 1999. 19. S. Seidel. Access Delays Related to the Main Memory Heirarchy on the SGI Origin2000. Dans Third European CRAY-SGI Workshop, Paris, France, Septembre 1997. 20. L.A. Smith et J.M. Bull. Development of Mixed Mode MPI/OpenMP Applications. Dans WOMPAT 2000, San Diego, Juillet 2000. 14