Programmation multicœur avec NI LabVIEW

Aperçu

Le logiciel de programmation graphique NI LabVIEW ne vous fait pas seulement gagner du temps. Il offre de nombreux avantages pour la programmation des processeurs multicœurs et autres matériels en parallèle tels que les FPGA (Field-Programmable Gate Array). L'un de ces avantages consiste à adapter automatiquement les applications aux microprocesseurs qui comportent deux ou quatre cœurs, ou plus et ce, la plupart du temps, sans programmation supplémentaire. De plus, les ingénieurs et scientifiques peuvent facilement visualiser les opérations en parallèle grâce au code graphique de LabVIEW qui représente de façon naturelle les modèles de programmation en parallèle les plus courants dans l'industrie et l'enseignement.

Le défi de la programmation parallèle

La programmation parallèle devient indispensable si l'on veut tirer le meilleur parti des processeurs multicœurs. Les processeurs modernes n'ont guère amélioré leurs fréquences d'horloge pour de nombreuses raisons et en particulier à cause de la consommation électrique et de la bande passante de la mémoire. À la place, les fabricants ont commencé à intégrer de multiples cœurs de processeurs sur un même circuit intégré, tout en conservant ou même en réduisant la fréquence d'horloge. De ce fait, au lieu d'attendre des accélérations de fréquence d'horloge pour améliorer la vitesse des applications, il devient préférable de concevoir des applications qui s'exécutent sur des processeurs multicœurs. À l'avenir, vous risquez de constater des ralentissements de performances si vous ne prenez pas le temps d'optimiser vos applications pour des processeurs multicœurs.

De nombreux outils ont été optimisés pour relever ce défi et vous permettre de créer du code capable de tirer parti des processeurs multicœurs. Vous pouvez attribuer manuellement des portions de code à des threads, que bon nombre de systèmes d'exploitation répartissent ensuite entre les différents cœurs des processeurs. Toutefois, la gestion de ces threads est difficile et prend beaucoup de temps. De plus, si différents API et langages annulent une partie des tâches associées aux threads, il est tout de même nécessaire de spécifier les opérations qui peuvent s'exécuter en parallèle.

Figure 1. CPU clock rates have stopped increasing multicore processors are the performance growth area now.

Figure 1. Les fréquences d'horloge du processeur n'augmentent plus et les performances se situent désormais au niveau des processeurs multicœurs.

Bénéficier automatiquement des processeurs multicœurs

La programmation dans LabVIEW implique la création de code graphique (G) qui ressemble à un organigramme, ce qui diffère de manière significative de la programmation en langages séquentiels traditionnels. On parle alors de programmation par flux de données. Au lieu d'écrire une séquence de commandes à exécuter l'une après l'autre, les programmes LabVIEW contiennent des variables et des opérations qui connectent chaque variable à la suivante. Le compilateur LabVIEW détermine ensuite automatiquement l'ordre des commandes à exécuter pour produire des résultats corrects. Cela signifie également que, lorsque deux sections parallèles de code ne sont pas interdépendantes, elles peuvent s'exécuter en même temps avec LabVIEW sur des cœurs différents d'un processeur.

Le simple problème d'arithmétique de la Figure 2 illustre ce processus. LabVIEW est capable de reconnaître que les fonctions Multiplier, Additionner et Soustraire peuvent s'exécuter en même temps car elles ne sont pas dépendantes les unes des autres.

Figure 2. Independent code paths can execute simultaneously.

Figure 2. Des chemins de code indépendants s'exécutent simultanément.

Le compilateur LabVIEW identifie de nombreuses sections de code parallèle sur le diagramme du VI et les affecte à un nombre fixe de threads pendant l'exécution. Cela vous évite d'avoir à manipuler les détails des threads manuellement, tout en minimisant la création de nouveaux threads qui pourraient avoir un impact négatif sur les performances.

 

Création manuelle des threads

La capacité de LabVIEW à gérer automatiquement les threads et à tirer parti des processeurs multicœurs ne signifie pas que vous n'avez plus le contrôle, lorsque c'est nécessaire. Vous pourriez avoir besoin, par exemple, d'isoler une tâche particulière, telle que la surveillance d'une condition d'urgence dans un thread à haute priorité dédié. Chaque structure cadencée de LabVIEW, y compris la boucle cadencée, crée un thread unique dans lequel le code de la structure s'exécute, et qui peut être affecté à un cœur spécifique de processeur en paramétrant une option d'affinité du processeur au cours du développement ou à l'exécution. Avec LabVIEW, vous vous concentrez sur le problème à résoudre plutôt que de passer du temps à mapper le code pour les processeurs multicœurs, sans toutefois renoncer à accéder aux commandes de bas niveau si besoin est.

 

Visualisation intuitive du code parallèle

LabVIEW dispose d'un avantage supplémentaire lorsqu'il programme des processeurs multicœurs : la représentation graphique intuitive du code parallèle. Bien que des programmes parallèles puissent être créés avec des langages séquentiels traditionnels, garder la trace des opérations en parallèle représente souvent un défi de taille. De plus, comme les ingénieurs travaillent la plupart du temps en groupe sur des applications de grande taille, le décodage de code parallèle que vous n'avez pas écrit vous-même constitue une tâche encore plus imposante.

Par contre, la programmation LabVIEW par flux de données bénéficie de l'une des formes de communication les plus simples : l'organigramme. Des années durant, les programmeurs en séquentiel ont créé des organigrammes pour garder la trace des éléments des programmes et pour communiquer entre eux. Au lieu de transcrire des organigrammes en code séquentiel, et vice-versa, vous avez ici la possibilité d'implémenter directement vos idées en code graphique de flux de données, et d'identifier rapidement les chemins de code parallèle qui s'exécutent sur des cœurs de processeurs différents.

Le code graphique de LabVIEW représente intuitivement les modèles de programmation parallèle les plus courants de l'industrie et de l'enseignement. Certains modèles populaires incluent la parallélisation des tâches, la parallélisation des données et la gestion de pipelines.

 

Parallélisation des tâches

La parallélisation des tâches consiste en plusieurs opérations distinctes exécutables en parallèle. Dans le code LabVIEW qui suit, vous remarquerez que les opérations de filtrage et de transformée de Fourier rapide (FFT) ne sont pas interdépendantes et qu'elles peuvent donc s'exécuter simultanément sur plusieurs cœurs du processeur.

Task parallelism

Figure 3. Exemple de parallélisation des tâches

 

Parallélisation des données

La parallélisation des données est un modèle de programmation courant qui consiste à répartir une grande quantité de données entre plusieurs blocs et à traiter les blocs en même temps avant de combiner les résultats. Remarquez la séparation des voies de données, le traitement et la fusion du code dans l'illustration.

Data parallelism

Figure 4. Exemple de parallélisation des données

 

Pipelining

Le pipelining représente une chaîne de montage d'opérations sur laquelle les fonctions sont continuellement répétées et les données transmises à l'opération d'après pour l'itération suivante. Dans LabVIEW, le pipelining peut être représenté par des unités d'attente, appelées nœuds de rétroaction, entre les opérations.

Pipelining

Figure 5. Exemple de pipelining

La plupart des applications pratiques, telles que le traitement de signaux RF et l'analyse d'images, combinent ces modèles avec d'autres modèles de programmation parallèle. Par exemple, il est possible d'implémenter plusieurs pipelines sur un seul diagramme du VI LabVIEW, pour représenter à la fois la parallélisation des tâches et le pipelining. Grâce à la visualisation intuitive du code parallèle dans LabVIEW, vous pouvez optimiser les applications pour des processeurs multicœurs.

 

Outil puissant de mise au point graphique

La mise au point est un élément important du développement de toute application, et LabVIEW dispose de fonctionnalités de mise au point et de connectivité intégrées ainsi que d'outils complémentaires pour mieux comprendre les opérations de programmation parallèle. Par exemple, la fonctionnalité Animer l'exécution de LabVIEW permet de visualiser le déplacement des données entre les opérations et l'exécution simultanée des chemins de code parallèle ; de plus, avec le Toolkit Desktop Execution Trace, vous pouvez voir la séquence exacte des événements dans l'application. Sur du matériel cible LabVIEW exécutant des systèmes d'exploitation temps réel, le Toolkit NI Real-Time Execution Trace affiche également l'historique complet du programme qui précise le cœur de circuit intégré sur lequel s'exécute chaque thread et le détail de son cadencement. Ceci permet d'identifier et de corriger des problèmes tels que l'inversion de priorité, au cas où une tâche prioritaire resterait en attente derrière une tâche secondaire utilisant les mêmes ressources. La possibilité de savoir à quel moment et sur quel cœur les threads s'exécutent, et quelles ressources ils utilisent constitue un atout majeur pour ajuster les performances et la fiabilité de l'application en éliminant tous les doutes.

 

Résoudre les problèmes d'ingénierie les plus complexes

En plus de la programmation de microprocesseurs multicœurs, vous pouvez utiliser LabVIEW avec d'autres matériels parallèles, y compris les FPGA, les unités de traitement graphique et même le cloud computing. Ces plates-formes matérielles possèdent toutes des caractéristiques, des avantages et des compromis uniques, et LabVIEW permet aux ingénieurs et scientifiques de bénéficier de la plate-forme idéale pour chaque application. Du fait que LabVIEW vise ces différents matériels, la programmation graphique peut mener à bien une grande variété de projets, malgré la diversité de leurs exigences de traitement parallèle.

D'ailleurs, des chercheurs qui travaillent sur certains des problèmes d'ingénierie les plus complexes (de la fusion au contrôle du plus grand télescope du monde) utilisent LabVIEW avec toute une gamme de matériels parallèles pour leurs applications. Au final, LabVIEW a été conçu pour aider les experts dans de nombreux domaines d'activités à concrétiser leurs idées. Sachant qu'avec son code graphique intuitif, LabVIEW peut tirer le meilleur parti des processeurs multicœurs, vous pouvez toujours utiliser le tout dernier matériel parallèle pour relever les défis d'ingénierie de la prochaine génération.

Étapes suivantes

Télécharger la série d'articles techniques sur LabVIEW

Essayer LabVIEW