Page suivante Page précédente Table des matières

2. Questions indépendantes de l'architecture.

2.1 Coté Noyau

  1. Linux supporte-t-il les threads multiples ? Si je lance deux ou plusieurs processus, seront-ils repartis entre les différents processeurs disponibles ?

    Oui. Les processus et les threads du noyau sont repartis entre les processeurs. Ceux de l'espace utilisateur ne le sont pas.

  2. Quelles sont les architectures SMP supportées ?

    De Alan Cox:

    Dans le 2.0, les systèmes SMP supportés sont les hypersparc (SS20, etc.) et Intel 486, Pentium ou machines supérieurs compatible avec la norme Intel MP1.1/1.4. Richard Jelinek ajoute: jusqu'à présent, seul des systèmes jusque que 4 processeurs ont été testé et la norme MP (et donc Linux) autorise théoriquement jusqu'à 16 processeurs.

    Le support SMP pour les architectures UltraSparc, SparcServer, Alpha et PowerPC est disponible dans le 2.2.x.

    De Ralf Bächle:

    MIPS, m68k et ARM ne support pas SMP; les deux derniers ne le supporteront probablement jamais.

    Cela dit, je ferai un hack pour MIPS-SMP aussitôt que j'aurais une machine SMP ...

  3. Comment fait-on un noyau Linux supportant SMP ?

    La plupart des distributions ne fournissent pas un noyau adapter au SMP, cela signifie que vous devrez le faire vous même. Si vous n'avez encore jamais compiler votre propre noyau, c'est une excellente raison pour apprendre comment cela se fait. Expliquer comment compiler un nouveau noyau dépasse le but de ce document; se référer vous au Linux Kernel Howto pour de plus ample information. (C. Polisher)

    Dans la série 2.0 jusque 2.1.132 exclu du noyau, décommenter la ligne SMP=1 dans le Makefile principal (/usr/src/linux/Makefile).

    Dans la version 2.2, configurez le noyau et répondez "oui" à la question "Symmetric multi-processing support" (Michael Elizabeth Chastain).

    ET

    autoriser l'horloge temps réel en cochant l'item "RTC support" (de Robert G. Brown). Notez qu'inclure le support RTC, en réalité, autant que je sache, n'empêche pas le problème connu de la dérive de l'horloge avec le SMP mais activer cette fonctionnalité prévient quand l'horloge est lue au démarrage. Une note de Richard Jelinek dit aussi qu'activer "Enhandced RTC" est nécessaire pour activer le deuxième processeur (identification) sur certaines cartes mère Intel originales.

    ET

    (noyau x86) NE PAS activer APM (advanced power management)! APM et SMP ne sont pas compatibles, et votre système plantera certainement (ou moins probablement ;)) au démarrage si APM est activer (Jakob Oestergaard). Alan Cox confirme cela : 2.1.x désactiver APM pour les machines SMP. En gros le comportement APM est indéfini en présence de systèmes SMP, et tout peut advenir.

    ET

    (noyau x86) activer "MTRR (Memory Type Range Register) support". Certains BIOS sont bogué, ils n'activent pas la mémoire cache du second processeur. Le support MTRR contient le code qui résout de tels problèmes.

    Vous devez reconstruire votre noyau et vos modules quand vous passer en SMP et quand vous changer de mode SMP. N'oubliez pas de faire make modules et make modules_install (de Alan Cox).

    Si vous obtenez des erreurs au chargement des modules, vous n'avez probablement pas réinstallé vos modules. Néanmoins, avec quelques noyaux 2.2.x, des gens ont reporté des problèmes lors de la recompilation d'un noyau SMP en noyau UP (Uni-Processeur). Afin de résoudre cela, sauvegardez votre fichier .config, et faite make mrproper, restaurer votre fichier .config, puis recompiler votre noyau (make dep, etc.) (Wade Hampton). N'oubliez pas de relancer lilo après avoir recopier votre nouveau noyau.

    Récapitulation:


    make config # ou menuconfig ou xconfig
    make dep
    make clean
    make bzImage # ou ce que vous voulez
    # copiez l'image du noyau manuellement puis RELANCER LILO 
    # ou make lilo
    make modules
    make modules_install
    

  4. Comment compile-t-on un noyau Linux non-SMP ?

    Dans la série 2.0, commenter la ligne SMP=1 dans le Makefile principal (/usr/src/linux/Makefile).

    Pour la série 2.2, configurer le noyau et répondez "no" à la question "Symmetric multi-processing support" (Michael Elizabeth Chastain).

    Vous devez absolument recompiler votre noyau et ses modules quand vous changer vers ou d'un mode SMP. N'oubliez pas de faire make modules et make modules_install et de lancer lilo. Voyez les notes plus haut sur les problèmes possibles de configuration.

  5. Comment savoir si çà marche ?

     cat /proc/cpuinfo 
    

    Sortie typique (double PentiumII):


    processor       : 0
    cpu             : 686
    model           : 3
    vendor_id       : GenuineIntel
    [...]
    bogomips        : 267.06
     
    processor       : 1
    cpu             : 686
    model           : 3
    vendor_id       : GenuineIntel
    [...]
    bogomips        : 267.06
    

  6. Quel est le statut de la migration du noyau vers un verrouillage fin et le multithreading ?

    La version 2.2 du noyau possède une gestion des signaux, des interruptions et quelque E/S à blocage fin (fine grain locking). Le reste est en cour de migration. En mode SMP, plusieurs processus peuvent être ordonnancés simultanément.

    Les noyaux 2.3 (futur 2.4) possède vraiment des blocages noyau fins. Dans la série des noyaux 2.3 l'usage des gros blocages noyau a tout simple disparut, tous les sous-systèmes majeurs du noyau Linux sont complètement coder avec des threads: réseau, VFS, VM, ES, block/pages de cache, ordonnancement, interruptions, signaux, etc. (Ingo Molnar)

  7. Linux SMP supporte-t-il les affinités processeur ?

    Noyaux standard

    Oui et non. Il n'est pas possible de forcer l'assignation d'un processus à un processeur spécifique mais l'ordonnanceur Linux possède un parti prit pour chaque processus, qui tend à conserver les processus attacher à un processeur spécifique.

    Patch

    Oui. Voir PSET - Processor Sets for the Linux kernel:

    Le but de ce projet est de faire une version équivalent compatible au niveau source et fonctionnalité de pset (tel que défini par SGI - partiellement retiré de leur noyau 6.4 IRIX) pour Linux. Cela autorise les utilisateurs à déterminer sur quel processeur ou ensemble de processeurs un processus peut tourner. Les utilisations possibles incluent assignement de thread à des processeurs distincts, synchronisation, sécurité (un processeur `root' dédier ?) et sûrement plus.

    Nous nous sommes attachés à concentrer toutes les fonctionnalités autour de l'appel système sysmp(). Cette fonction prend un certain nombre de paramètres qui déterminent quelle fonction est requise. Ces Fonctions comprennent:

    • Assignation d'un processus/thread à processeur spécifique
    • Interdire un processeur d'exécuter certains processus
    • Empêcher strictement l'utilisation d'un processeur
    • Assigner à un processeur un _unique_ processus (et ces fils)
    • Information sur l'état du processeur
    • création/destruction d'ensemble de processeurs, sur lesquels les processus peuvent être limités

  8. Où dois-je rapporter les bogues SMP ?

    S'il vous plaît rapportez les bogues à linux-smp@vger.rutgers.edu.

  9. A propos des performances SMP ?

    Si vous voulez mesurer les performances de votre système SMP, vous pouvez essayer les tests de Cameron MacKinnon, disponibles à http://www.phy.duke.edu/brahma/benchmarks.smp.

2.2 Coté utilisateur

  1. Ai-je vraiment besoin de SMP ?

    Si vous vous demandez, c'est que vous n'en avez probablement pas besoin. :) Généralement, les systèmes multiprocesseurs offrent de meilleurs performance que les systèmes monoprocesseurs, mais pour obtenir un gain quelconque vous devez considérer beaucoup d'autres facteurs que le nombre de processeur. Par exemple, sur un système donné, si le processeur est en général inactif, la plupart du temps à cause d'un disque dur lent, alors ce système est "entrée/sortie limitée" ("input/output bound"), et ne bénéficiera probablement pas de la puissance d'un processeur supplémentaire. Si d'un autre coté, un système doit exécuter beaucoup de processus simultanés, et l'utilisation processeur est très forte, alors vous êtes susceptible d'améliorer les performances de votre système. Les disques dur SCSI peuvent être très efficaces utilisés avec de multiple processeurs, grâce à la façon dont ils peuvent gérer de multiples commandes sans immobiliser le processeur.(C. Polisher)

  2. Est-ce que j'obtiens les mêmes performances d'un biprocesseur 300 MHz qu'un processeur 600 MHz ?

    Cela dépend de l'application, mais généralement non. Le SMP implique quelques "frais de gestion" qu'une machine monoprocesseur n'a pas. (Wade Hampton). :)

  3. Comment peut-on afficher les performances de plusieurs processeurs ?

    Merci à Samuel S. Chessman, ici se trouvent quelques utilitaires pratiques:

    Character based:

    http://www.cs.inf.ethz.ch/~rauch/procps.html

    En gros, c'est procps v1.12.2 (top, ps, et. al.) et quelques patches pour le support SMP.

    Pour les 2.2.x, Gregory R. Warnes a rendu disponible un patch à http://queenbee.fhcrc.org/~warnes/procps

    Graphique:

    xosview-1.5.1 supporte le SMP. Et les noyaux supérieurs au 2.1.85 (inclus) l'entrée cpuX dans le fichier /proc/stat.

    La page d'accueil officielle pour xosview est: http://lore.ece.utexas.edu/~bgrayson/xosview.html

    Ici vous trouverez une version patchée par Kumsup Lee pour les noyaux 2.2.x : http://www.ima.umn.edu/~klee/linux/xosview-1.6.1-5a1.tgz

    Les différents patches noyau de Forissier sont disponibles à: http://www-isia.cma.fr/~forissie/smp_kernel_patch/

    Néanmoins, vous ne pouvez pas contrôler l'ordonnancement précisément avec xosview, car xosview produit une perturbation de l'ordonnancement lui même. (H. Peter Anvin)

  4. Comment autoriser plus d'un processus lors de la compilation du noyau ?

    utiliser:


            # make [modules|zImage|bzImages] MAKE="make -jX"
            où X = nombre maximum de processus.
            ATTENTION: Cela ne marche pas avec "make dep".
    

    Avec un noyau 2.2, référez vous au fichier /usr/src/linux/Documentation/smp.txt pour des instructions spécifiques.

    BTW, comme lancer de multiples compilateurs autorise une machine avec suffisamment de mémoire à utiliser le temps processeur autrement perdu durant les délais causés par les E/S, make MAKE="make -j 2" -j 2 aide réellement même sur les machines monoprocesseurs. (de Ralf Bächle).

  5. Pourquoi le temps donner par la commande time est erroné ? (de Joel Marchand)

    Dans la série des 2.0, le résultat rendu par la commande time est faux. La somme utilisateur+système est juste *mais* 'l'étendue' entre le temps utilisateur et le temps système est faux.

    Plus précisément: "L'explication est que tout le temps passer sur un processeur autre que celui de démarrage est comptabiliser comme temps système. Si vous chronométrer un programme, ajoutez le temps utilisateur et le temps système, alors votre chronométrage sera à peu près juste, à ceci près qu'il inclut aussi le temps système qui est à peu près juste, à ceci près qu'il inclut le temps système qui est correctement décompter" (Jakob Østergaard).

    Ce bogue est corrigé dans les 2.2.

2.3 Programmation SMP

Section par Jakob Østergaard.

Cette section a pour but de souligner ce qui marche, et ce qui ne marche pas quand il s'agit de programmer des logiciels avec de multiples threads pour SMP Linux.

Méthodes de parallélisation

  1. threads POSIX (POSIX Threads)
  2. PVM / MPI Message Passing Libraries
  3. fork() -- Processus multiples

Comme ni fork(), ni les processus PVM/MPI ne partagent généralement pas la mémoire, mais communiquent au moyen d'IPC ou d'une API de messagerie, ils ne seront pas décrit plus avant dans cette section. Ils ne sont pas très spécifiques à SMP, puisqu'ils sont employés autant - voir plus - sur des ordinateurs monoprocesseurs et des clusters de ceux-ci.

Seul les threads POSIX nous fournissent des threads multiples partageant les ressources comme - particulièrement - la mémoire. C'est cette capacité qui fait des machines SMP leur particularité, autoriser plusieurs processeurs à partager leur mémoire. Pour employer deux (ou plus ;) processeurs d'un système SMP, utilisez une librairie de thread du noyau. Une bonne librairie est LinuxThreads, une librairie de thread écrite per Xavier Leroy qui est maintenant intégrée avec la glibc2 (aka libc6). Les distributions Linux récentes intègrent toutes cette librairie par défaut, vous n'avez donc pas à obtenir un paquetage séparé pour utiliser les threads du noyau.

Il existe des implémentations des threads (et thread POSIX) qui sont de niveau application, et ne tirent pas avantage des threads du noyau. Ces paquetages gardent le thread dans un seul processus, et par-là ne tirent pas avantage du SMP. Néanmoins, elles sont bonnes pour beaucoup d'application et ont tendance à être plus rapide que les threads du noyau sur des systèmes monoprocesseurs.

Le multi-threading n'a jamais été vraiment populaire dans le monde UN*X. Pour quelques raisons, les applications exigeant de multiple processus ou thread, ont été pour la plupart écrite en utilisant fork(). Donc, en utilisant l'approche des threads, certain rencontre des problèmes d'incompatibilités (de non-adaptation aux thread des) librairies, compilateurs et debogueurs. GNU/Linux ne fait pas exception à cela. Espèront que les quelques prochaines sections apporteront une petite lumière sur ce qui possible et ce qui ne l'est pas.

La librairie C

Les vieilles librairies ne sont pas sures au niveau threads. Il est très important que vous utilisiez la GNU LibC (glibc), aussi connue sous le nom de libc6. Vous pouvez évidemment utiliser des versions antérieurs, mais cela vous causera plus de problèmes que de mettre à jour votre système, enfin probablement :)

Si vous voulez utiliser GDB pour déboguer vos programmes, voyer plus bas.

Languages, Compilateurs et débogueurs

Il y a une grande quantité de langage de programmation disponible sous GNU/Linux, et beaucoup d'entre eux utilisent les threads d'une manière ou d'une autre (certains langages comme Ada et Java possède même les threads dans les primitives du langage).

Cette section, toutefois, en ce moment, ne décrira que le C et le C++. Si vous avez de l'expérience en programmation SMP avec d'autre langages, S'il vous plaît éclairez nous.

les compilateurs GNU C et C++, tout comme EGCS C et C++, fonctionnent avec le support thread de la librairie C standard (glibc). Il y a néanmoins quelques problèmes:

  1. Quand vous compilez en C ou C++, utilisez -D_REENTRANT définit dans la ligne de commande du compilateur. Il est nécessaire de faire fonctionner certaines fonctions error-handling comme la variable errno.
  2. Quand vous utilisez C++, si deux threads rencontrent des exceptions simultanément, le programme retournera une erreur de segmentation. Le compilateur ne génère pas de code d'exception adapté aux threads. Une manière de contourner le problème est de mettre un pthread_mutex_lock(&global_exception_lock) dans le(s) constructeurs de chaques classes que vous throw(), et mettre le pthread_mutex_unlock(...) correspondant dans le destructeur. Ce n'est pas beau mais çà marche. La solution est donnée par Markus Ferch.

Le GNU Débogueur GDB à partir de 4.18, devrait prendre en main les threads correctement. La plupart des distributions Linux offrent une version patchée de gdb pour prendre en compte les threads.

Il n'est pas nécessaire de patcher la glibc dans le but de la faire fonctionner avec des threads. Si vous n'avez pas besoin de déboguer le logiciel (cela peut-être vrai pour toutes les machines qui ne sont pas dédiée au développement), il n'y a pas besoin de patcher la glibc.

Notez que les core-dumps ne sont d'aucune utilité quand vous utilisé de multiple threads. D'une manière ou d'une autre, le core dump est attaché aux thread courant, et non au programme tout entier. Aussi, quand vous déboguer quelque chose, faite le du débogueur

Astuce: Si vous avez un thread qui perd la tête, comme utiliser 100% du temps CPU, et que vous semblez ne pas pouvoir deviner pourquoi, voici une belle manière de trouver ce qui se passe: lancez le programme depuis la ligne de commande, sans GDB. Faites perdre la tête à votre thread. Utilisez top pour obtenir le PID du processus. Lancez GDB tel que gdb program pid. Cela fera GDB s'attacher lui-même au processus dont vous avez spécifier le PID, et arrêter le thread. Vous avez maintenant une session GDB avec le thread offensant, et pouvez utiliser bt ou d'autre pour voir ce qui arrive.

Atres librairies

ElectricFence: Cette librairie n'est pas sure du point de vue SMP Il devrait être possible, néanmoins, de la faire fonctionner dans un environnement en insérant des verrous mutex dans le code d'ElectricFence.

D'autres points à propos de la programmation SMP

  1. Où puis-je trouver plus d'information sur la programmation parallèle ?

    Voyez Linux Parallel Processing HOWTO

    Beaucoup d'informations utiles peuvent être trouvé à Parallel Processing using Linux

    Voyez aussi Linux Threads FAQ

  2. Existe-t-il des programmes ou des librairies utilisant les threads ?

    Oui. Pour les programmes vous devriez regarder à Multithreaded programs on linux (J'adore les liens hypertextes, le saviez vous ? ;))

    En ce qui concerne les librairies, il y a:

    OpenGL Mesa library

    Merci à David Buccarelli, andreas Schiffler et Emil Briggs, il existe une version multithread (à l'heure actuelle [1998-05-11], il y a une version qui fonctionne et permet d'obtenir un accroissement de 5-30% avec certaine suite de test (benchmarks) OpenGl). La partie multithread est maintenant incluse dans la distribution Mesa officielle comme une option expérimentale. Pour plus d'information, voyez Mesa library

    BLAS

    BLAS et FFTs optimisé Pentium pro pour Intel Linux

    Les routines multithread BLAS ne sont pas disponibles pour l'instant, mais une librairie multithread est prévue pour 1998-05-27, voir Blas News pour plus de détails.

    The GIMP

    Emil Briggs, la même personne qui est impliquer dans la version multithread de MESA, est aussi en train de travailler sur la version multithread des plugins de The Gimp. Voyez http://nemo.physics.ncsu.edu/~briggs/gimp/index.html pour plus d'info.


Page suivante Page précédente Table des matières