Stratégies de programmation pour le traitement multicœur: parallélisation des tâches

Aperçu

Jusqu’à récemment, les progrès du matériel informatique ont offert des améliorations significatives de la vitesse d’exécution des logiciels, qui n’ont nécessité que peu d’efforts de la part des développeurs de logiciels. Les augmentations de vitesse du processeur ont apporté un décollage instantané de la vitesse des logiciels. Cependant, alors que les vitesses de processeur ont atteint un pic et que les fabricants de processeurs ont utilisé de nouvelles techniques pour augmenter la puissance de traitement, cette situation commence à changer. L’introduction des processeurs multicœurs offre un nouveau défi aux développeurs de logiciels, qui doivent désormais maîtriser les techniques de programmation nécessaires pour bénéficier du potentiel du traitement multicœur. L’une de ces techniques de programmation est la parallélisation des tâches.

Contenu

Parallélisation des tâches

 La parallélisation des tâches est simplement l’exécution concurrente de tâches indépendantes dans le logiciel. Considérez un processeur simple-cœur qui exécute un navigateur Web et un programme de traitement de texte simultanément. Bien que ces applications soient des process séparés, elles partagent toujours en fin de compte le même processeur. Pensez maintenant à un scénario dans lequel les deux mêmes programmes s’exécutent sur un processeur double-cœur. Sur la machine double-cœur, ces deux applications peuvent, pour l’essentiel, s’exécuter indépendamment l’une de l’autre. Bien qu’elles puissent partager quelques ressources qui les empêchent de s’exécuter complètement indépendamment, la machine double-cœur permet d'effectuer les deux tâches parallèles plus efficacement.

Le parallélisme naturel de la programmation par flux de données fait de l’environnement de développement graphique LabVIEW de National Instruments le langage de programmation idéal pour l’utilisation de techniques de programmation parallèle. Les langages textuels traditionnels possèdent une syntaxe séquentielle et sont donc difficiles à visualiser et à organiser sous forme parallèle. Au contraire, la création d’une application multithread est intuitive et simple avec NI LabVIEW. 

Parallélisation des tâches en LabVIEW

Le paradigme de la programmation graphique LabVIEW facilite la programmation parallèle, même pour les utilisateurs novices. Deux tâches séparées qui ne sont pas dépendantes l’une de l’autre par rapport aux données (ou d’autres ressources) s’exécutent en parallèle sans nécessiter de programmation supplémentaire.

La partie supérieure du code suivant consiste en une tâche d’acquisition analogique de tension et la partie inférieure représente une tâche de génération numérique.

Figure n°1. En LabVIEW, deux sections de code sans dépendance de données s’exécuteront indépendamment, en parallèle.

Ces deux tâches indépendantes d’acquisition de données doivent partager la même U.C. sur un processeur simple-cœur. Sur un processeur multicœur, chaque thread peut s’exécuter sur son propre processeur, ce qui améliore fortement la vitesse d’exécution. 

En utilisant le parallélisme de données dans une application, il est important de faire en sorte que deux tâches n’aient aucune ressource partagée susceptible de créer un goulot d'étranglement, comme dans le code présenté dans la Figure n°2.


Figure n°2. Lorsqu’une tâche dépend d’une autre pour les données, les deux tâches ne peuvent pas ensuite s’exécuter indépendamment.

Dans ce programme, les deux tâches partagent des données ; la tâche numérique est obligée d’attendre que la tâche analogique ait réellement démarré. Bien que ce code semble être parallèle, il ne l’est pas vraiment parce que les deux tâches partagent des données. Il est important d’être conscient de cet écueil lors de la programmation d'applications qui utilisent la parallélisation des tâches.

Une application du parallélisme des tâches

Une équipe de développeurs de la société Eaton Corporation, dont la seule mission est d'affiner les systèmes de test et de mesure utilisés dans le service R&D de la division Camions d’Eaton, a amélioré les performances du traitement multicœur et l’architecture multithread de leur application LabVIEW jusqu’à quadrupler le nombre de voies acquises et traitées sur les systèmes d’Eaton et ce tout en assurant un déterminisme temps réel. Cette application LabVIEW est constituée de trois boucles parallèles asynchrones qui exécutent les tâches d’acquisition, de contrôle et d’interface utilisateur. Avant d’implémenter cette solution, l’équipe ne pouvait satisfaire ses exigences qu’en divisant la charge de travail de manière séquentielle ou qu’en utilisant plusieurs ordinateurs de bureau simple-cœur pour exécuter l’application. Avec des systèmes de bureau standards, l’équipe a pu minimiser la consommation électrique, la dissipation thermique ainsi que les temps de test et ce, tout en diminuant globalement les coûts.

Grâce à la parallélisation des tâches ainsi qu’à d’autres techniques de programmation, les développeurs peuvent tirer complètement profit de la puissance offerte par le traitement multicœur. Les programmeurs qui comprennent et prêtent attention à ces techniques sont capables de concevoir aujourd’hui des applications adaptées aux tendances du traitement du futur. La nature intrinsèquement parallèle de l’environnement de programmation graphique LabVIEW donne aux développeurs les capacités de générer avec efficacité les applications de demain.