Articles techniques

La perspective de MathWorks

Améliorer la performance de vos simulations dans Simulink


Auteurs:

  • Weiwu Li, MathWorks
  • Reid Spence, MathWorks
  • Guy Rouleau, MathWorks

22 minutes de lecture

Quel que soit le niveau de complexité du modèle, tout utilisateur de Simulink® souhaite améliorer les performances de ses simulations. Cet article présente de nombreux conseils et techniques pratiques pour vous aider à optimiser les performances de vos workflows de simulation. 

Premières étapes pour améliorer les performances de simulation

Vous devez d'abord examiner votre workflow de simulation pour comprendre combien de fois le modèle doit exécuter les étapes d'édition, d'initialisation et de simulation. Par exemple, les quatre workflows courants suivants présentent des caractéristiques très différentes. Le choix du mode de simulation et des options de performance les plus adaptés dépend du workflow que vous utilisez parmi ces quatre.

Le premier workflow est Édition-Mise à jour-Répétition (figure 1). Ce workflow est typique lorsque vous appuyez sur Ctrl+D pour mettre à jour le modèle sans être encore prêt à le valider par simulation ; il est également typique lorsque vous apportez des modifications importantes à vos modèles.

Diagramme illustrant le workflow Édition-Mise à jour-Répétition pour les simulations.

Figure 1. Le workflow Édition-Mise à jour-Répétition.

Le deuxième workflow est Édition-Simulation-Répétition, qui nécessite de modifier la structure et d'initialiser le modèle à chaque fois (figure 2).

Diagramme illustrant le workflow Édition-Simulation-Répétition pour les simulations.

Figure 2. Le workflow Édition-Simulation-Répétition.

Le troisième workflow est Réglage-Simulation-Répétition (figure 3). Il porte sur le réglage itératif de certains paramètres, sans qu'il soit nécessaire de modifier la structure du modèle.

Diagramme illustrant le workflow Réglage-Simulation-Répétition pour les simulations.

Figure 3. Le workflow Réglage-Simulation-Répétition.

Le quatrième workflow est Multisimulation (figure 4). Il s'agit généralement de nombreuses simulations avec des modèles vérifiés, pour lesquelles le déchargement de l'exécution serait utile.

Diagramme illustrant le workflow Multisimulation pour les simulations.

Figure 4. Le workflow Multisimulation.

Un autre facteur qui influencera notre choix de solutions de performance est l'étape de la simulation qui représente la part prédominante du temps de calcul total. Vous pouvez utiliser les informations temporelles de l'objet SimulationMetadata renvoyé dans l'objet Simulink.SimulationOutput pour voir quelle proportion du temps total est consacrée à l'initialisation ou à l'exécution. Dans l'exemple ci-dessous, les performances de ce modèle sont dominées par le temps d'exécution ; nous devons donc nous concentrer sur des solutions visant à accélérer l'exécution du modèle plutôt que son initialisation.

Vous pouvez consulter les métadonnées de simulation du modèle utilisé dans votre workflow le plus courant pour mieux comprendre les propriétés de la simulation. L'objet SimulationMetadata contient des informations sur une exécution de simulation, notamment des informations sur le modèle, des informations temporelles et des informations d'exécution, etc. Vous pouvez récupérer les informations temporelles en accédant à la propriété out.SimulationMetadata.TimingInfo. Voici un exemple des informations temporelles des métadonnées de simulation : 

 WallClockTimestampStart: '2021-12-16 10:57:15'
 WallClockTimestampStop: '2021-12-16 10:58:44'
 InitializationElapsedWallTime: 0.6918
 ExecutionElapsedWallTime: 87.8463
 TerminationElapsedWallTime: 0.4087
 TotalElapsedWallTime: 88.9468
 ProfilerData: 'Profiler is not enabled'

En fonction de votre workflow de simulation et des caractéristiques du modèle (temps d'initialisation par rapport au temps d'exécution, etc.), vous pouvez vous reporter rapidement au tableau 1 ci-dessous pour sélectionner et essayer les techniques appropriées.

Techniques Workflow
Édition-Mise à jour-Répétition Édition-Simulation-Répétition Réglage-Simulation-Répétition Multisimulation
Mode simulation   x x x
Fast Restart     x x
Cache de simulation x x x x
Référencement de modèles -
Compilation parallèle
x x    
Référencement de modèles -
Chargement incrémental et
Recompilation
x x    
Simulink Profiler x x x x
Solver Profiler   x x x
Modification des modèles   x x x
Simulation parallèle       x

Tableau 1. Techniques courantes pour améliorer les performances de la simulation.

Sélection du mode de simulation approprié

Simulink propose trois modes de simulation : normal, Accelerator et Rapid Accelerator (figure 5). Comme leur nom l'indique, le mode Accelerator est généralement plus rapide que le mode normal, et le mode Rapid Accelerator l'est encore davantage. Chaque augmentation de vitesse implique généralement un sacrifice en termes de flexibilité, d'interactivité et/ou de diagnostic. Dans de nombreux cas, si vous pouvez vous passer de l'une de ces fonctionnalités — au moins temporairement —, la vitesse de simulation s'améliorera.

Capture d'écran des options de mode de simulation : normal, Accelerator et Rapid Accelerator.

Figure 5. Modes de simulation Simulink.

En mode normal, Simulink interprète votre modèle lors de chaque exécution de simulation. Si vous modifiez fréquemment votre modèle, c'est généralement le mode à privilégier, car il ne nécessite aucune étape de compilation séparée, contrairement aux modes Accelerator et Rapid Accelerator.

En mode Accelerator, Simulink compile le modèle en un moteur d'exécution en mémoire, éliminant ainsi le surcoût bloc à bloc d'une simulation interprétée en mode normal. Le mode Accelerator supporte le débuggeur et le profileur, mais seulement un ensemble limité de diagnostics d'exécution. Le mode Accelerator est souvent utilisé lorsque le temps de simulation est beaucoup plus long que le temps de compilation.

En mode Rapid Accelerator, Simulink compile un exécutable autonome pour le modèle, qui peut s'exécuter dans un processus distinct. Vous ne pouvez utiliser le mode Rapid Accelerator que si l'ensemble du modèle permet de générer du code. Ce mode restreint l'interaction avec le modèle pendant les simulations. Par exemple, le mode Rapid Accelerator ne supporte pas le débuggage. Comme pour le mode Accelerator, il est préférable d'utiliser le mode Rapid Accelerator lorsque vos simulations durent beaucoup plus longtemps que la compilation, effectuée une seule fois.

Vous vous demandez peut-être quel mode choisir pour votre workflow. La figure 6 montre les performances d'un modèle hypothétique simulé en mode normal, Accelerator et Rapid Accelerator.

Graphique illustrant les performances des modes de simulation normal, Accelerator et Rapid Accelerator sur un modèle hypothétique.

Figure 6. Performances d'un modèle hypothétique simulé dans différents modes de simulation.

En règle générale, le mode normal est recommandé dans un workflow de « développement », où vous modifiez souvent le modèle et exécutez update diagram ou une simulation courte entre les modifications. À l'inverse, utilisez le mode Rapid Accelerator lorsque vous souhaitez exécuter plusieurs simulations sans apporter de modifications structurelles aux modèles, comme l'ajout ou la suppression de blocs.

Si vous savez que le modèle ne sera pas modifié entre les exécutions, vous pouvez demander à Simulink d'ignorer l'initialisation du mode Rapid Accelerator en réglant RapidAcceleratorUpToDateCheck sur « off ». Veuillez noter que les modifications apportées aux paramètres non réglables seront ignorées. Si une limitation de votre modèle empêche l'utilisation du mode Rapid Accelerator, utilisez plutôt le mode Accelerator.

En savoir plus sur le fonctionnement des modes d'accélération, le choix d'un mode de simulation, les raisons de la recompilation en mode Accelerator et la comparaison des performances.

Quand les modes d'accélération profitent plus à certains modèles qu'à d'autres

Il se peut que certains modèles bénéficient davantage des modes Accelerator ou Rapid Accelerator que d'autres. Si votre modèle ne bénéficie pas d'une amélioration notable des performances, il se trouve peut-être dans l'une des situations suivantes :

L'algorithme de votre modèle est principalement contenu dans quelques blocs complexes, comme le bloc Fast Fourier Transform ou les lookup tables. Un petit modèle peut s'exécuter plus lentement dans un mode d'accélération, car les blocs natifs sont hautement optimisés. En revanche, un modèle comportant de nombreux blocs de base est plus susceptible de bénéficier d'une accélération.

Votre modèle contient principalement du code compilé, comme du code provenant de S-functions, de blocs Stateflow® et de fonctions MATLAB®. L'utilisation de l'étape de compilation n'augmentera pas davantage la vitesse du modèle.

Vos exécutions de simulation comprennent des phases d'initialisation ou de terminaison. Comme les modes d'accélération n'agissent que sur la phase de simulation de chaque exécution, ils peuvent n'apporter qu'une faible amélioration si les phases d'initialisation ou de terminaison sont longues. Pour plus de détails, consultez la section Accélération de la phase d'initialisation de cet article.

Votre modèle contient des blocs qui ne peuvent pas être compilés, tels que des blocs Interpreted MATLAB Function ou des System objects MATLAB en mode interprété.

Activation de Fast Restart pour les simulations itératives

Dans un workflow de simulation Simulink classique, lorsque vous cliquez sur le bouton Run, Simulink met d'abord à jour et compile le modèle, puis le simule. Ce processus se répète pour chaque exécution suivante. Toutefois, si vos simulations itératives nécessitent uniquement de modifier les entrées du modèle ou des paramètres réglables, vous n'avez généralement pas besoin de modifier la structure du modèle. Pour ces workflows, la phase d'initialisation est généralement inutile après la première exécution et son coût s'accumule rapidement lorsque vous exécutez des centaines, voire des milliers de simulations.

Simulink propose une fonctionnalité intéressante appelée Fast Restart. Comme son nom l'indique, elle vous permet d'exécuter des simulations itératives en ne compilant le modèle qu'une seule fois (figure 7).

Capture d'écran de la fonctionnalité Fast Restart dans Simulink.

Figure 7. Activation de Fast Restart dans Simulink.

Lorsque Fast Restart est activé, le modèle ne s'arrête pas automatiquement après chaque exécution. Le modèle est alors automatiquement réinitialisé à l'aide des informations d'initialisation enregistrées pour la prochaine série de simulations, sans recompilation.  

Lorsque Fast Restart est utilisé, le modèle est verrouillé et vous ne pouvez pas modifier sa structure. Cela empêche toute modification structurelle du modèle jusqu'à la fin des simulations. Vous pourrez toutefois toujours modifier les paramètres réglables ou les signaux d'entrée et observer leur effet sur les simulations.

Vous pouvez activer Fast Restart depuis la barre d'outils, comme indiqué ci-dessus, et dans les simulations programmatiques à l'aide des fonctions sim et parsim.

Utilisation du point de fonctionnement de la simulation

Les ingénieurs simulent généralement un modèle Simulink de manière itérative pour différentes entrées, conditions aux limites et conditions de fonctionnement. Dans de nombreuses situations, ces simulations partagent une phase de démarrage commune au cours de laquelle le modèle passe de son état initial à un autre état. Un moteur électrique, par exemple, peut être amené à sa vitesse de fonctionnement avant que différentes séquences de contrôle ne soient testées.

Les points de fonctionnement de simulation vous permettent d'enregistrer un instantané de la simulation à la fin de la phase de démarrage, puis de le restaurer pour l'utiliser comme état initial des simulations suivantes. Cette technique n'améliore pas la vitesse de simulation en soi, mais elle peut réduire le temps de simulation total des exécutions consécutives, car la phase de démarrage n'a besoin d'être simulée qu'une seule fois (voir la figure 8 ci-dessous).

Illustration de la manière dont Fast Restart et la restauration du point de fonctionnement réduisent le temps de simulation total.

Figure 8. Utilisation de Fast Restart et de la restauration du point de fonctionnement.

En savoir plus sur le comportement des points de fonctionnement.  

Exécution de plusieurs simulations en parallèle

Vous pouvez réduire le temps total nécessaire à l'exécution de plusieurs simulations indépendantes en répartissant les tâches de simulation entre plusieurs cœurs de traitement grâce à Simulink et Parallel Computing Toolbox™. Vous pouvez réduire encore davantage le temps de simulation global en utilisant MATLAB Parallel Server™, qui vous permet d'étendre les simulations à des clusters et au cloud.

Les cas d'utilisation courants de l'exécution de simulations en parallèle incluent l'analyse de Monte-Carlo, l'optimisation du design et les balayages de cas de test. Par exemple, vous pouvez configurer une simulation de Monte-Carlo dans laquelle vous faites varier la valeur d'un paramètre sur une plage prédéterminée. Vous pouvez ensuite effectuer des simulations pour chaque valeur de paramètre indépendamment et en parallèle sur plusieurs cœurs.

Vous pouvez paralléliser de nombreuses tâches liées à l'optimisation du design, notamment l'estimation des paramètres du modèle à partir des données de test, le réglage des gains du contrôleur pour obtenir la réponse souhaitée, l'optimisation des paramètres de design, ainsi que les analyses de sensibilité et de robustesse. Le temps total de simulation diminue à mesure que le nombre de processeurs utilisés augmente.

En général, vous avez deux possibilités pour configurer des exécutions de multisimulation en parallèle : le panneau Multiple Simulations ou un script qui appelle la fonction parsim. Vous pouvez configurer et exécuter les simulations directement dans le panneau Multiple Simulations de Simulink Editor (voir la figure 9). Dans le panneau Multiple Simulations, vous pouvez spécifier les valeurs des paramètres de bloc et des variables de l'espace de travail pour les simulations. En sélectionnant l'option « use parallel », vous pouvez activer automatiquement l'exécution parallèle de votre simulation.

Capture d'écran du panneau Multiple Simulations dans Simulink Editor.

Figure 9. Utilisation du panneau Multiple Simulations pour démarrer une simulation parallèle.

Vous pouvez également utiliser la construction parsim pour démarrer votre simulation parallèle à l'aide d'un script MATLAB. Par rapport au panneau Multiple Simulations, un script parsim offre plus de flexibilité et des options avancées.  

En savoir plus sur la configuration et l'exécution de simulations avec le panneau Multiple Simulations.

En savoir plus sur l'exécution de simulations parallèles, la commande parsim et l'utilisation de parsim avec des simulations en mode Rapid Accelerator.

Le référencement de modèles vous permet d'inclure un modèle dans un autre à l'aide d'un bloc Model. Chaque instance de ceci est appelée référence de modèle. Comme les sous-systèmes, le référencement de modèles vous permet d'organiser une hiérarchie de modèles de grande taille (figure 10). 

Capture d'écran des options de recompilation des références de modèle.

Figure 10. Options de recompilation des références de modèle. 

L'utilisation de références de modèles présente de nombreux avantages en termes de performances :

  • Chargement incrémental. Les modèles référencés ne sont chargés qu'en cas de besoin.
  • Simulation accélérée. Le référencement de modèles vous permet de stocker des parties d'une simulation dans différents fichiers de modèles. Si une grande partie de la simulation reste inchangée, vous pouvez la placer à l'intérieur d'un modèle référencé en mode accélérateur. Cette partie ne sera compilée qu'une seule fois lors de la première exécution, puis initialisée et simulée plus rapidement lors des exécutions suivantes.
  • Recompilation incrémentale. Si l'option Rebuild sélectionnée pour les références de modèle est « If any changes in known dependencies detected », les cibles de simulation qui implémentent ces modèles référencés ne sont pas générées à chaque exécution des simulations, mais uniquement régénérées si le modèle référencé et/ou l'une de ses dépendances ou interfaces change. Cette option est plus rapide que l'option « If any changes detected », car elle évite l'étape de calcul de la somme de contrôle du modèle. Si vous savez avec certitude que la structure de votre modèle ne sera pas modifiée pendant les simulations, vous pouvez régler l'option Rebuild sur « Never » pour accélérer encore davantage le processus.
  • Compilation parallèle. Pour les modèles qui contiennent de grandes hiérarchies de références de modèle, vous pouvez réduire le temps de génération de code et de compilation en compilant les modèles référencés en parallèle. Avec Parallel Computing Toolbox ou MATLAB Parallel Server, vous pouvez répartir la génération de code et la compilation sur plusieurs workers MATLAB de votre configuration.

Les références de modèle sont généralement utilisées dans un environnement d'équipe, où vous pouvez exécuter des simulations basées sur des composants créés par d'autres personnes. Simulink peut packager ces artefacts de compilation dans un seul fichier de cache Simulink, avec l'extension .SLXC, pour chaque modèle de la hiérarchie (figure 11).

Capture d'écran mettant en évidence le fichier de cache Simulink .slxc.

Figure 11. Fichier de cache Simulink.

Avec les fichiers de cache Simulink, Simulink ne recompile que les fichiers obsolètes, tant que le paramètre de configuration Rebuild est réglé sur « If any changes detected (default) » ou « If any changes in known dependencies detected ». Vous et les membres de votre équipe pouvez partager ces fichiers SLXC et les fichiers de modèle Simulink correspondants.

Lorsque vous exécutez la simulation sur votre machine, Simulink extrait les fichiers dérivés nécessaires du fichier SLXC pour chaque modèle. Simulink n'a donc pas besoin d'effectuer de recompilations inutiles et termine la simulation plus rapidement.

De plus, les fichiers de cache Simulink s'appliquent à plusieurs types d'artefacts de compilation, qui ne sont pas forcément des cibles de simulation de références de modèle (par exemple, des cibles Rapid Accelerator). Le partage de ces fichiers de cache Simulink réduit considérablement le coût de recompilation dans un workflow d'équipe.

En savoir plus sur le référencement de modèles.

En savoir plus sur les fichiers de cache Simulink.

Analyse des modèles pour identifier les goulots d'étranglement de la simulation

Simulink possède des fonctionnalités intégrées qui peuvent vous aider à comprendre systématiquement vos modèles, à identifier les goulots d'étranglement des performances de simulation et à améliorer la vitesse de simulation.

Performance Advisor

Performance Advisor peut être lancé depuis l'onglet Debug, tout comme Simulink Profiler et Solver Profiler (figure 12).

Capture d'écran de l'onglet Debug de Simulink mettant en évidence l'option Performance Advisor.

Figure 12. Démarrage de Performance Advisor.

Performance Advisor analyse le modèle et effectue différents contrôles portant sur les conditions et les paramètres de configuration susceptibles de dégrader les performances de simulation. Performance Advisor propose des recommandations pour améliorer les paramètres de configuration du modèle, ainsi que des mécanismes pour corriger les problèmes automatiquement ou manuellement.

Une fois les modifications recommandées appliquées à votre modèle, Performance Advisor peut vérifier dans quelle mesure elles ont amélioré les performances (figure 13). 

Capture d'écran des paramètres de Simulink Performance Advisor.

Figure 13. Simulink Performance Advisor.

En savoir plus sur Performance Advisor.

Simulink Profiler

Dans Simulink, vous pouvez utiliser deux types de profileurs pour analyser les simulations lentes de votre modèle. Si vous ne savez pas lequel utiliser, reportez-vous à la figure 14 pour une prise en main rapide. Simulink Profiler permet de déterminer quels blocs prennent le plus de temps de simulation, et Solver Profiler analyse pourquoi le solveur à pas variable effectue certains pas.

Arbre de décision pour l'évaluation des simulations lentes à l'aide de Simulink Profiler ou de Solver Profiler.

Figure 14. Utilisation de Simulink Profiler et de Solver Profiler.

Simulink Profiler vous permet de quantifier le temps nécessaire à chaque phase de votre simulation et le temps nécessaire à la simulation de chaque bloc. Simulink Profiler est souvent utilisé en mode normal pendant la phase de design afin d'examiner le temps d'exécution de chaque bloc. L'utilisation de Simulink Profiler peut générer une grande quantité de données. Pour réduire la quantité de données à examiner, concentrez-vous sur les méthodes qui consomment le plus de temps et sur celles qui sont appelées le plus fréquemment.

Simulink Profiler identifie la source du ralentissement de la simulation, ce qui vous permet d'évaluer manuellement le temps d'exécution de la simulation. Vous pouvez également remplacer les blocs les plus gourmands en calcul par des blocs plus légers pour accélérer la simulation (figure 15).

Capture d'écran de Simulink Profiler appliqué à un modèle de système de transmission automatique.

Figure 15. Simulink Profiler.

En savoir plus sur Simulink Profiler.

Solver Profiler

Lorsque la simulation d'un modèle avec un solveur à pas variable ralentit, effectue trop de petits pas ou cesse de répondre, Solver Profiler peut vous aider à comprendre le comportement du solveur et à identifier les facteurs qui affectent la simulation.

De nombreux facteurs peuvent affecter le comportement du solveur et limiter la vitesse de la simulation. Solver Profiler enregistre et signale tous les événements majeurs qui se produisent lors de la simulation d'un modèle :

  • Événements de passage par zéro
  • Événements d'exception du solveur
  • Événements de réinitialisation du solveur
  • Événements de calcul de la jacobienne

Si votre modèle comprend des blocs Simscape™, vous pouvez également examiner différentes grandeurs physiques de ces blocs à l'aide de Simscape Results Explorer.

Solver Profiler présente des informations graphiques et statistiques sur la simulation, les paramètres du solveur, les événements et les erreurs. Vous pouvez utiliser ces données pour identifier les emplacements du modèle à l'origine des goulots d'étranglement de la simulation et prendre des mesures, par exemple modifier la raideur du système pour améliorer les performances de simulation.  

Solver Profiler est généralement utilisé avec un solveur à pas variable pour expliquer pourquoi votre simulation effectue trop de pas ou pourquoi un pas est si petit. En revanche, si vous cherchez à comprendre pourquoi chaque pas de simulation prend trop de temps, ou si vous utilisez un solveur à pas fixe, Simulink Profiler, présenté dans la section précédente, est l'outil approprié (figure 16).

Capture d'écran de Solver Profiler présentant des informations graphiques et statistiques sur une simulation.

Figure 16. Solver Profiler.

En savoir plus sur Solver Profiler, la détection de passage par zéro et les réinitialisations du solveur.

Modification et simplification du modèle

La plupart des techniques décrites jusqu'à présent nécessitent peu, voire aucune, modification du modèle lui-même. Vous pouvez obtenir des améliorations de performance supplémentaires en appliquant des techniques qui impliquent des modifications du modèle.

Accélération de la phase d'initialisation

Lorsque vous mettez à jour ou ouvrez un modèle, Simulink exécute le code d'initialisation du masque. Si vous avez des commandes d'initialisation de masque complexes qui contiennent de nombreux appels à set_param, envisagez de regrouper les appels consécutifs à set_param() en un seul appel avec plusieurs paires d'arguments. Cela peut réduire le surcoût associé à ces appels.

En savoir plus sur l'exécution du code de masque.

Si vous utilisez des scripts MATLAB pour charger et initialiser des données, vous pouvez souvent améliorer les performances en chargeant plutôt des fichiers MAT. L'inconvénient est que les données d'un fichier MAT ne sont pas sous une forme lisible par l'homme et peuvent donc être plus difficiles à manipuler qu'un script. Cependant, le chargement initialise généralement les données beaucoup plus rapidement que le script équivalent.

En savoir plus sur le chargement de données d'un fichier MAT dans votre espace de travail.

Réduction de la complexité du modèle

Simplifier votre modèle sans sacrifier la fidélité est un moyen efficace d'améliorer les performances de la simulation. Voici trois façons de réduire la complexité du modèle.

Remplacer un sous-système par une alternative de moindre fidélité. Dans de nombreux cas, vous pouvez simplifier votre modèle en remplaçant un modèle de sous-système complexe par l'un des éléments suivants :

  • Un modèle dynamique linéaire ou non linéaire créé à partir de données d'entrée-sortie mesurées à l'aide de System Identification Toolbox™
  • Un modèle statistique non linéaire haute fidélité créé à l'aide de Model-Based Calibration Toolbox™
  • Un modèle linéaire créé à l'aide de Simulink Control Design™
  • Une lookup table

Vous pouvez conserver les deux représentations du sous-système dans une bibliothèque et utiliser des sous-systèmes variants pour les gérer.

En savoir plus sur l'utilisation des blocs de sous-système configurables.

En savoir plus sur l'utilisation des lookup tables, l'optimisation de l'espacement des points de rupture dans les lookup tables et l'optimisation du code généré pour les blocs Lookup Table.

En savoir plus sur la modélisation d'ordre réduit.

Réduire le nombre de blocs. Lorsque vous réduisez le nombre de blocs dans votre modèle, moins de blocs devront être mis à jour pendant les simulations, ce qui permettra d'accélérer les exécutions de simulation. La vectorisation est un moyen de réduire le nombre de blocs. Par exemple, si vous avez plusieurs signaux parallèles qui subissent un ensemble de calculs similaires, essayez de les combiner en un vecteur et d'effectuer un seul calcul. Une autre méthode consiste à activer l'optimisation Block Reduction dans la section Optimization > General des paramètres de configuration.

Utiliser le traitement par trames. Dans le traitement par trames, les échantillons sont traités par lots au lieu d'un à la fois. Si votre modèle comprend un convertisseur analogique-numérique, par exemple, vous pouvez collecter les échantillons de sortie dans une mémoire tampon et traiter cette mémoire tampon en une seule opération, telle qu'une transformée de Fourier rapide. Ce traitement des données par paquets réduit le nombre d'invocations des blocs de votre modèle. En général, le surcoût de planification diminue à mesure que la taille de trame augmente. Cependant, les trames plus grandes consomment davantage de mémoire, et les limitations de mémoire peuvent nuire aux performances des modèles complexes. Testez différentes tailles de trame pour trouver celle qui maximise les gains de performance du traitement par trames sans provoquer de problèmes de mémoire.

Réduction de l'interactivité

En général, plus le modèle est interactif, plus la simulation sera longue. Les conseils de cette section illustrent des façons d'améliorer les performances en renonçant à une certaine interactivité.

Désactiver les diagnostics de débuggage. Certaines fonctions de diagnostic activées ralentissent sensiblement les simulations. Vous pouvez les désactiver dans le volet Diagnostics de la boîte de dialogue Configuration Parameters.

Remarque : L'exécution des diagnostics array bounds exceeded et solver data inconsistency peut entraîner un ralentissement notable des performances d'exécution du modèle.

Désactiver les animations de simulation. Par défaut, les diagrammes Stateflow mettent en évidence les états actifs et animent les transitions d'état qui se produisent pendant l'exécution du modèle. Cette fonctionnalité est utile pour le débuggage, mais elle ralentit la simulation. Pour accélérer les simulations, fermez tous les diagrammes Stateflow ou désactivez l'animation. De même, si vous utilisez Simulink 3D Animation™, la visualisation SimMechanics™, FlightGear ou un autre package d'animation 3D, envisagez de désactiver l'animation ou de réduire la fidélité de la scène pour améliorer les performances.

En savoir plus sur l'accélération de la simulation dans Stateflow.

Ajuster les paramètres propres aux visualiseurs et gérer les visualiseurs au moyen de sous-systèmes activés. Si votre modèle contient un visualiseur Scope qui affiche un grand nombre de points de données et que vous ne pouvez pas le supprimer, essayez d'ajuster les paramètres du visualiseur afin de privilégier la vitesse de rendu au détriment de la fidélité. Attention toutefois : en utilisant la décimation pour réduire le nombre de points de données tracés, vous risquez de manquer des transitoires courts et d'autres phénomènes qui seraient évidents avec davantage de points de données. Vous pouvez placer des visualiseurs dans des sous-systèmes activés afin de contrôler plus précisément quelles visualisations sont activées et à quel moment.

En savoir plus sur l'influence des paramètres du visualiseur de signaux Scope sur les performances.

Utilisation de blocs MATLAB Function au lieu de blocs Interpreted MATLAB Function

Pour appeler une fonction MATLAB dans votre modèle Simulink, utilisez un bloc MATLAB Function plutôt qu'un bloc Interpreted MATLAB Function ou une S-function MATLAB. Le bloc MATLAB Function est l'alternative la plus rapide. Il permet de générer du code C embarquable. Bien que le bloc MATLAB Function ne supporte pas toutes les fonctions MATLAB, le sous-ensemble du langage MATLAB qu'il supporte est vaste.

Pour trouver rapidement tous les blocs Interpreted MATLAB Function de votre modèle, utilisez Performance Advisor.

En savoir plus sur l'utilisation du bloc MATLAB Function.

Vous enregistrez de grands jeux de données. Lors de l'enregistrement de grandes quantités de données (par exemple, dans des modèles qui incluent des blocs To Workspace, To File ou Scope), utilisez la décimation ou limitez la sortie enregistrée à la dernière partie de la simulation. Évitez d'enregistrer des données redondantes (par exemple, n'enregistrez le temps qu'une seule fois) et des données superflues (par exemple, enregistrez des valeurs entières plutôt que des valeurs de type double lorsque c'est possible). Le remplacement des paramètres d'enregistrement permet également de contrôler quels signaux sont enregistrés sans recompiler la cible de simulation en mode Accelerator.

En savoir plus sur l'exportation des données de simulation.

Techniques utiles supplémentaires

Les techniques suivantes s'appliquent à certains modèles spécifiques ; si votre modèle correspond aux schémas décrits ci-dessous, vous pourrez probablement les utiliser pour augmenter la vitesse de simulation.

Optimisation de l'accélération hardware

SIMD (Single Instruction Multiple Data) est une technique de traitement parallèle au niveau des données qui effectue la même opération sur plusieurs points de données simultanément. De nombreux CPU modernes disposent d'instructions SIMD qui, par exemple, effectuent plusieurs additions ou multiplications simultanément. Pour les opérations nécessitant une puissance de calcul importante sur les blocs supportés, les intrinsèques SIMD peuvent améliorer les performances de la simulation.

Simulink supporte SIMD pour l'accélération hardware dans tous les modes de simulation qui utilisent des technologies de génération de code (par exemple, le mode Accelerator ou Rapid Accelerator).

Simulink propose un paramètre configset permettant de contrôler le type de SIMD dans le panneau Simulation Target. Pour les options d'accélération hardware, le choix par défaut (« leverage generic hardware ») est disponible sur tous les CPU X86 et ne nécessite aucune recompilation. L'autre option (« leverage native hardware ») dépend du CPU. Si votre CPU supporte des jeux d'instructions SIMD plus récents, tels que SSE2/AVX2/AVX512, ce choix peut offrir une vitesse de simulation encore plus élevée (figure 17).

Capture d'écran des options d'accélération hardware dans Simulink.

Figure 17. Configuration des options d'accélération hardware. 

Lorsque vous utilisez une cible de simulation, de nombreux facteurs déterminent si SIMD est disponible et s'il peut améliorer la vitesse de votre simulation. Vous pouvez utiliser Performance Advisor, décrit précédemment, pour exécuter la vérification « check hardware Acceleration Settings » sous Simulation Target afin de déterminer si SIMD est utile ou non pour votre modèle.  

En savoir plus sur l'accélération hardware.

Exploitation de la simulation multicœur

Dans Simulink, il existe plusieurs techniques différentes pour accélérer une simulation unique en confiant certaines parties du modèle à une exécution multicœur. Ces techniques ne s'appliquent pas à tous les modèles, mais elles peuvent s'avérer utiles dans vos cas d'utilisation spécifiques.

Simulation multicœur des domaines de flux de données. Si vous modélisez et simulez un système de traitement du signal à forte intensité de calcul ou un système de traitement du signal multidébit dans Simulink, les domaines de flux de données amélioreront les performances. Le domaine de flux de données est un nouveau domaine d'exécution qui simule à l'aide d'un modèle de calcul à flux de données synchrone. Le domaine d'exécution de flux de données est piloté par les données et peut simuler en utilisant plusieurs cœurs.

Pour spécifier le flux de données comme domaine d'exécution d'un sous-système, réglez le paramètre Domain sur Dataflow dans Property Inspector. Les domaines de flux de données partitionnent automatiquement votre modèle et simulent le système à l'aide de plusieurs threads pour améliorer les performances de simulation (figure 18).

Capture d'écran montrant la spécification du flux de données comme domaine d'exécution dans Property Inspector.

Figure 18. Domaine d'exécution du flux de données.

Vous pouvez utiliser le bouton Run Analysis de l'onglet multicore pour analyser le domaine de flux de données et évaluer les performances de la simulation. Cette analyse peut profiler le modèle, calculer le temps d'exécution de chaque bloc, identifier le parallélisme existant dans le modèle et le partitionner en plusieurs threads. Elle peut suggérer une valeur de latence pour augmenter encore le débit de simulation en pipelinant l'exécution des blocs. L'analyse de la figure 19 ci-dessous suggère que la latence devrait être réglée entre 0 et 2 pour des performances optimales. 

Capture d'écran de l'analyse du domaine de flux de données pour les performances de simulation.

Figure 19. Analyse du domaine de flux de données pour les performances de simulation.

Apprenez-en davantage sur domaine de flux de données.

Simulation multicœur avec composants de cosimulation. Votre modèle de simulation peut inclure des composants de cosimulation. Un composant de cosimulation peut être un bloc S-function, implémenté comme une passerelle de cosimulation entre Simulink et des outils tiers ou du code personnalisé. Il peut également s'agir d'une FMU en mode cosimulation importée dans Simulink ou d'un bloc Model en mode Accelerator. Si ces composants de cosimulation sont thread-safe, ils peuvent être exécutés sur plusieurs threads. Être thread-safe signifie que le bloc peut fonctionner avec plusieurs threads accédant à des données, des ressources et des objets partagés sans aucun conflit.

Tous les modèles ne possèdent pas de composants de cosimulation pouvant s'exécuter sur plusieurs threads. De plus, la cosimulation multithread ne supporte que le mode de simulation normal. Par défaut, Simulink configure tous les modèles et blocs éligibles pour une exécution multithread. Si les performances peuvent être améliorées, Simulink exécute automatiquement tous les modèles sur plusieurs threads.

En savoir plus sur la cosimulation multicœur.

Utilisation de la simulation multicœur avec un sous-système For Each. Le sous-système For Each est un sous-système Simulink qui répète l'exécution d'un algorithme lors d'un pas de simulation pour chaque élément d'un sous-tableau d'un signal d'entrée ou d'un tableau de paramètres de masque. Si votre modèle contient des sous-systèmes For Each gourmands en calcul, vous pouvez potentiellement accélérer la simulation en exécutant les itérations du sous-système For Each sur plusieurs threads.

La simulation multicœur d'un sous-système For Each ne supporte que le mode de simulation Rapid Accelerator. Par défaut, le support de la simulation multithread pour le sous-système For Each est activé. Simulink effectuera automatiquement le profilage de la simulation à la volée. L'exécution parallèle n'est activée que si Simulink détecte des gains de performance. Vous pouvez utiliser le paramètre de modèle 'MultithreadedSim' pour activer ou désactiver manuellement la simulation multithread.

En savoir plus sur l'utilisation d'un sous-système For Each.

Application des techniques et mesure des résultats

Pour illustrer l'efficacité relative de ces techniques sur un projet réaliste, nous avons mesuré l'amélioration du temps de simulation obtenue en appliquant certaines des modifications suggérées ci-dessus à un modèle de système de transmission automatique (figure 20).

Capture d'écran d'un modèle Simulink d'un système de transmission automatique.

Figure 20. Modèle Simulink d'un système de transmission automatique.

Pour améliorer les performances, nous avons d'abord utilisé Performance Advisor pour effectuer les vérifications et avons apporté les modifications suggérées suivantes :

  • Désactivation des diagnostics coûteux qui vérifient l'incohérence des données du solveur, la division par une matrice singulière, les sorties de bloc Inf ou NaN, la plage de simulation et le dépassement des limites de tableau
  • Remplacement des blocs Interpreted MATLAB Function par des fonctions MATLAB (c'est la modification qui a le plus d'impact)
  • Activation des optimisations Block Reduction
  • Fermeture et mise en commentaire des blocs Scope

Ces modifications ont permis de réduire le temps de simulation de 57 secondes à 3,3 secondes en moyenne. À partir du modèle optimisé, nous pouvons maintenant appliquer le mode Rapid Accelerator et la simulation parallèle pour comparer les performances de ces techniques (tableau 2).

Modèle d'origine, mode normal, exécution en série, Fast Restart désactivé 5 731 secondes
Modèle amélioré, mode normal, exécution en série, Fast Restart désactivé 328 secondes
Modèle amélioré, mode normal, exécution en série, Fast Restart activé 307 secondes
Modèle amélioré, mode Rapid Accelerator, exécution en série, avec RapidAcceleratorUpToDateCheck désactivé  236 secondes
Modèle amélioré, mode normal, simulation parallèle, Fast Restart activé (4 workers locaux) 198 secondes
Modèle amélioré, mode Rapid Accelerator, simulation parallèle, avec RapidAcceleratorUpToDateCheck désactivé (4 workers locaux) 85 secondes

Tableau 2. Durée de 100 itérations de chaque modèle pour 2 000 secondes de temps de simulation. Système utilisé : Lenovo T490s avec CPU Intel® Core™ i7-8665U (1,9 GHz, 2 112 MHz, 4 cœurs), 32 Go DDR4 2 400 MHz PC4-19200 SODIMM, disque : SSD de 1 To, Windows 10 Enterprise, MATLAB R2022a.

Publié en 2022


Produits utilisés : Simulink, Parallel Computing Toolbox

À propos des auteurs

Weiwu Li

Weiwu Li is a product manager responsible for simulation capabilities of Simulink and Simulink Compiler. Prior to joining MathWorks in 2016, he had many years of experience in the automotive industry as a system controls engineer. Weiwu has a Ph.D. in controls engineering from Zhejiang University, an M.S.M.E. from The Ohio State University, and an M.B.A. from Purdue University.

Guy Rouleau

Guy Rouleau is a consulting advanced support engineer at MathWorks and has been supporting Simulink users since 2007. In his role, Guy works closely with customers on technical challenges, bringing his expertise in engineering systems and applied modeling to support advanced MATLAB and Simulink workflows. Guy is the author of the “Guy on Simulink” blog, where he shares tips and tricks he’s learned while supporting Simulink users. He holds a master’s degree in mechanical engineering from McGill University, in collaboration with the Canadian Space Agency.

Continuer votre exploration