• Aucun résultat trouvé

Utilisation de l’interface de haut niveau

Après nous être intéressés à son architecture, nous présentons dans cette section l’utilisation de l’interface de haut niveau de notre bibliothèque, sans connaissance particulière de la programma- tion GPU. Cette utilisation est rendue possible à l’aide de deux structures principales : le contexte d’exécution et un ou plusieurs plugins offrant l’accès aux fonctions de haut niveau de MCMAS.

7.4.1 Initialisation de MCMAS

L’interface de haut niveau de MCMAS est basée sur l’utilisation d’un contexte d’exécution de type MCMASContext. Cet objet contient l’ensemble des structures nécessaires à la soumission d’un traitement OpenCL, et admet différents constructeurs permettant au développeur d’indiquer le type et les paramètres d’exécution souhaités, tel que représenté dans le Listing 7.4.

Une fois instancié, un contexte MCMAS peut être utilisé pour créer et appeler des plugins MCMAS. Ces deux modes d’utilisation peuvent être librement combinés pour un même contexte.

Listing 7.4 – Exemples de création de différents types de contexte MCMAS

1 / / Aucun argument , s é l e c t i o n a u t o m a t i q u e de l a p l a t e −forme d ’ ex é c u t i o n par

MCMAS:

2 / / GPU en p r i o r i t é , p u i s CPU.

3 MCMASContext context = new MCMASContext () 4

5 / / Dé f i n i t i o n e x p l i c i t e de l a p r i o r i é t é des p l a t e −formes à u t i l i s e r :

6 MCMASContext context = new MCMASContext ( ContextType .GPU , ContextType . CPU ) 7

8 / / Cré a t i o n d ’ un c o n t e x t e GPU

9 MCMASContext context = new MCMASContext ( ContextType . GPU ) 10

11 / / Cré a t i o n d ’ un c o n t e x t e CPU

12 MCMASContext context = new MCMASContext ( ContextType . CPU ) 13

14 / / Cré a t i o n d ’ un c o n t e x t e s u p p o r t a n t l e p r o f i l i n g

15 MCMASContext context = new MCMASContext ( MCMAS . PROFILING );

7.4.2 Exemples d’appel de fonctions de haut niveau

Une fois un contexte MCMAS obtenu, il est possible de l’utiliser pour appeler de nombreuses fonctions de haut niveau regroupées sous forme de plugins spécialisés inclus dans la bibliothèque. Chacun de ces plugins propose un ensemble de fonctions classées par thématique d’utilisation (calcul de distance, diffusion...) Ces fonctions admettent un certain nombre de paramètres d’entrée et de sortie correspondants au traitement à effectuer. L’accent est mis, au niveau de ces paramètres d’entrée, sur l’utilisation de tableaux statiques et d’autres structures Java standard, de manière à permettre la plus large utilisation possible de ces fonctions.

Des outils de conversions fournis avec MCMAS facilitent le passage vers ces types depuis les autres types de données référencés dans notre présentation précédente, et en particulier depuis des objets, des buffers de données ou des objets. Nous illustrons dans la suite de cette section l’utilisation de certains des plugins fournis par notre bibliothèque.

Calcul de distances

Une première fonctionnalité rencontrée dans de nombreux systèmes multi-agents, dont le mo- dèle proie-prédateur, est le calcul de distances euclidiennes entre individus. Selon le type de mo- dèle employé, ce calcul peut être effectué en une, deux ou trois dimensions, sur des coordonnées entières (grille) ou réelles.

L’obtention de ces distances implique généralement, sur CPU, le calcul séquentiel de cette distance pour chaque couple d’agents présents dans le modèle, ou le calcul de ces distances à la volée pour les seuls points utilisés.

Le calcul de ces distances pouvant être aisément effectué en parallèle, il est possible de réaliser tous ces calculs en simultané avec MCMAS, en indiquant en entrée les coordonnées à considérer et en récupérant l’ensemble des distances comme résultat.

Les coordonnées des points d’entrée peuvent être spécifiées sous forme d’un tableau par dimen- sion à considérer (array_x, array_y, array_z), sous forme de tableau de structures coordonnées, ou encore sous forme de tableau de type vectoriel OpenCL tel que float2 ou float3, comme évoqué précédemment.

Pour deux ensembles de M et N coordonnées d’entrée, le résultat de ce module est une grille comprenant les distances euclidiennes entre chaque point du premier ensemble et chaque point du second ensemble, de dimension M × N, et de type compatible avec le stockage des coordonnées d’entrée (entier, réel ou flottant).

Diffusion

Une autre opération souvent rencontrée dans les modèles multi-agents est la diffusion d’une quantité au sein d’un vecteur ou d’une grille. Ce mécanisme est souvent utilisé pour des mises à jour de l’environnement, de manière à simuler la diffusion de phéromones par exemple dans le cas du modèle des fourmis, ou de populations dans des modèles de reproduction d’individus dans un nouvel habitat.

Cette diffusion est caractérisée par plusieurs paramètres :

— Le nombre de dimensions considérées : le nombre de cellules voisines vers lesquelles dif- fuser est directement lié à la configuration du modèle. Dans un modèle à une dimension, avec des cellules en grille, seules deux voisines devront être considérées, contre six dans le cas de deux dimensions et vingt-six dans un cas à trois dimensions.

— La possibilité ou non de diffuser en diagonale : le calcul précédent suppose que l’ensemble des cellules voisines sont considérées. Si seules celles partageant une arête avec la cel- lule courante sont prises en compte (diffusion "en croix"), alors le nombre de voisins pour chaque cellule est modifié, ce qui peut changer drastiquement le comportement de la simu- lation.

Un autre choix important pour effectuer cette diffusion est le comportement devant être retenu aux limites de la grille, où certains voisins sont manquants :

— Une première approche est de supposer toute diffusion en dehors de la grille comme perdue. Ces frontières se comportent alors comme un puits sans fond, et peuvent amener une perte de matière dans le modèle (système non clos).

— Une autre approche est d’interdire la diffusion en dehors de la grille (système fermé). Cette approche est préférable dans le cadre d’un véritable environnement fermé, mais décon-

seillée dans le cas d’un modèle ne représentant qu’une fraction d’un environnement plus vaste, comme une parcelle de terrain d’un territoire, car elle introduit des frontières ar- tificielles pouvant influer sur le cycle d’évolution des agents situés à la périphérique du modèle, sans que cette influence n’ait aucune base pratique.

— Une dernière approche, enfin, est de considérer l’environnement agent comme bouclant verticalement et horizontalement. Cette approche, souvent retenue pour des raisons de commodité, revient à représenter l’espace de simulation comme la projection d’un tore. Le module diffusion de MCMAS fournit les opérations correspondant à ces différents cas. Cette implémentation est également basée sur l’utilisation de programmes OpenCL adaptés à chaque type de données d’entrée (scalaire, structure ou vectoriel, entière ou flottante).

Le lancement d’une diffusion peut être effectué en quelques lignes, à l’aide des paramètres acceptés par la fonction, comme l’illustre le Listing 7.5.

Listing 7.5 – Exemple d’utilisation du plugin diffusion sur une grille de flottants représentée par un tableaux à deux dimensions

1 / / Dé c l a r a t i o n des s t r u c t u r e s

2 float [][] grille , grilleResultat ; 3

4 / / I n s t a n t i a t i o n d ’ un c o n t e x t MCMAS e t du p l u g i n de d i f f u s i o n

5 MCMASContext context = new MCMASContext () ;

6 DiffusePlugin diffuser = DiffusePlugin . newInstance ( context ); 7

8 / / Pr é p a r a t i o n des s t r u c t u r e s de donn é es MCMAS

9 MCMASGrid input = MCMAS . createGridFrom ( grille );

10 MCMASGrid output = MCMAS . createGridFrom ( grilleResultat ); 11

12 / / Lancement d ’ une d i f f u s i o n e t r é cup é r a t i o n du r é s u l t a t .

13 / / D i f f u s e P l u g i n . DIMENSION_4 r e q u i e r t une d i f f u s i o n v e r t i c a l e e t h o r i z o n t a l e

:

14 / / D i f f u s e P l u g i n . DIMENSION_8 p e r m e t t r a i t de demander l a p r i s e en compte des

d i a g o n a l e s .

15 diffuser . diffuse ( input , output , DiffusePlugin . DIMENSION_4 ); 16

17 / / Recopie de l a g r i l l e obtenu e dans l a s t r u c t u r e j a v a o r i g i n a l e

18 output . write ( grilleResultat );

De nombreux modèles agents imposent également des limites minimales et maximales particu- lières à la valeur pouvant être stockée dans chaque cellule. Ces limitations sont prises en compte par le plugin diffusion fourni par MCMAS via la disponibilité de variantes bornées des opérations précédentes, permettant d’indiquer la valeur minimale et la valeur maximale permises pour chaque cellule.

Cette opération de normalisation peut également être effectuée à l’aide d’un plugin spécialisé fourni par MCMAS, de manière indépendante.

Réduction

De très nombreuses simulations agents requièrent la production régulière d’indicateurs associés au modèle, comme la quantité globale d’énergie présente dans le système ou la population dans le modèle proie-prédateur. La dispersion de ces quantités entre les différents éléments du modèle implique, à chaque itération, de pouvoir synthétiser ces quantités dans une variable globale, à même d’être affichée ou utilisée pour interrompre ou non la simulation.

Des modèles de programmation CPU tels que OpenMP ou MPI facilitent cette opération à l’aide de primitives de réduction, permettant au concepteur d’indiquer les données devant être réduites et l’opération à utiliser (somme, minimum, maximum...)

MCMAS reprend cette logique dans un plugin spécialisé permettant d’effectuer cette réduction en parallèle à l’aide des informations suivantes :

— Le champ de la réduction : un vecteur ou une grille contenant la propriété du modèle agents à prendre en compte.

— L’opération de réduction : minimum, maximum, moyenne, addition, multiplication... Le résultat d’une réduction totale est un type scalaire, et un vecteur pour une réduction partielle. Comme dans le cadre d’une diffusion, le type résultat est compatible avec le type d’entrée : flottant, par exemple, pour une réduction sur des données flottantes.

Fonctions affines

Un autre type de traitement parallélisable est, comme nous l’avons vu dans le cas du modèle proie-prédateur, l’application d’une même fonction affine a × x + b à chaque cellule d’un vecteur ou d’une grille d’entrée.

Cette opération est directement supportée par MCMAS sur ces deux structures de données, un vecteur pouvant être considéré comme une grille à une dimension. Le Listing 7.6 illustre l’appel du plugin effectué pour la croissance de l’herbe dans le cadre du modèle proie-prédateur.

Listing 7.6 – Application d’une fonction affine sur les éléments d’une grille

1 / / Dé c l a r a t i o n des s t r u c t u r e s

2 float [][] grille , grilleResultat ; 3

4 / / I n s t a n t i a t i o n d ’ un c o n t e x t MCMAS e t du p l u g i n de d i f f u s i o n

5 MCMASContext context = new MCMASContext () ;

6 DiffusePlugin transformer = AXBPlugin . newInstance ( context ); 7

8 / / Pr é p a r a t i o n des s t r u c t u r e s de donn é es MCMAS

9 MCMASGrid input = MCMAS . createGridFrom ( grille );

10 MCMASGrid output = MCMAS . createGridFrom ( grilleResultat ); 11

12 / / Lancement de l a t r a n s f o r m a t i o n e t r é cup é r a t i o n du r é s u l t a t .

13 / / a v a u t 1 . 0 , car aucun f a c t e u r v a r i a b l e de c r o i s s a n c e n ’ e s t a p p l i q u é .

14 / / b v a u t GRASS_GROWTH, l e t a u x de c r o i s s a n c e f i x e dé f i n i dans l a s i m u l a t i o n

.

15 transformer . transform ( input , output , 1.0 , GRASS_GROWTH ); 16

17 / / Recopie de l a g r i l l e obtenue dans l a s t r u c t u r e j a v a o r i g i n a l e

18 output . write ( grilleResultat );

7.4.3 Utilisation depuis des framework multi-agents existants

La bibliothèque MCMAS est utilisable directement en Java, mais doit également pouvoir être accessible à des plates-formes multi-agents ne permettant pas l’accès direct à ce langage.

Dans ce cas, il est possible de fournir le service assurant le rôle d’interlocuteur et de traducteur entre le formalisme utilisé par la plate-forme et MCMAS. Ce service peut être un agent du système

spécialisé, tel qu’illustré sur la Figure 7.4, ou un système indépendant, accessible par le biais de messages. Bibliothèque MCSMA Parcelle Agent service Interfaces MCSMA Cellule Cellule Diffusion Diffusion Réduction populations cellules diffusion(cellules) reduction(cellules, totals) Traitement messages et appels de services Encapsulation des résultats

Figure 7.4 – Exemple d’utilisation de MCMAS depuis un modèle multi-agents

Chacun de ces messages doit respecter un format bien défini, indiquant le traitement souhaité ainsi que des contraintes d’exécution du calcul (sur GPU, sur CPU...). L’identité de l’expéditeur est mémorisée avant le traitement de chacun de ces messages, de manière à pouvoir lui envoyer les résultats de l’exécution dans un autre message une fois la requête traitée.

Par exemple, dans le cas de Madkit où les agents communiquent à l’aide d’un gestionnaire de messages, ce processus se traduit pas la mise en place d’un protocole d’échange. Dans le cas de GAMA, cette intégration peut être réalisée sous la forme d’un plugin ajoutant des fonctions MCMAS au langage de description utilisé pour les agents.

Cette couche d’adaptation entre MCMAS et la plate-forme multi-agents ciblée permet l’utili- sation transparente de la bibliothèque, en conservant l’infrastructure du modèle existant.

L’utilisation d’un agent service permettant la réalisation de traitements MCMAS est une autre solution utilisant les mécanismes de communication du modèle existant. Il est également possible d’utiliser MCMAS directement au niveau de chaque agent, soit à l’aide de Java directement, soit à l’aide d’une couche d’adaptation dans le cas de plates-formes telles que GAMA ou NetLogo.