IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

[FAQ : discussion] Comment utiliser le double-coeur/multi-coeur (multithreading) ?


Sujet :

Contribuez

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Par défaut [FAQ : discussion] Comment utiliser le double-coeur/multi-coeur (multithreading) ?
    Je suis passé voir la réponse de la FAQ à ce sujet.

    En l'état des choses, le multi-coeur n'est pas exploitable en OCaml.
    Ça n'est pas vrai. Les threads caml ne peuvent pas tourner à plusieurs simultanément, mais les processus, créés avec fork, sont gérés par le système d'exploitations et sont donc souvent répartis sur les différents processeurs/coeurs de la machine.

    Des tests avaient été faits, et pour des tâches qui se prêtent bien au parallélisme, fork est redoutablement efficace : si on a 4 coeur, le programme va effectivement 4 fois plus vite que sur un seul coeur (et pas 2 fois ou 3 fois comme avec certaines technologies qui ajoutent beaucoup en complexité, et donc masquent un peu le gain de performances).

  2. #2
    Membre Expert
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Par défaut
    Ma réponse reste quand même valable sous Windows où j'ai un message "Unix.fork not implemented".

    Peut être sous Linux alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # #load "unix.cma";;
    # Unix.fork ();;
    - : int = 0
    # - : int = 5760
    Mais je ne peux pas vérifier: mon noyau est compilé avec SMP=no

    Vu que fork est dépendant de l'OS je propose de scinder la question:
    1. Comment utiliser le double-coeur/multi-coeur (multithreading) sous Windows ?
    2. Comment utiliser le double-coeur/multi-coeur (multithreading) sous Unix/Linux ?


    Par contre je n'ai pas les connaissances pour la réponse à la seconde question.
    Si quelqu'un pouvait poster une source minimaliste dans Page code source, avec un Unix.fork qui faut chauffer deux coeurs, ça serait un geste apprécié.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Par défaut
    D'une part, la version Cygwin supporte fork. D'autre part create_process est implémenté dans les versions MinGW et Visual-pouet, et apporte la fonctionnalité (en un peu plus lourd à utiliser).

  4. #4
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    On en a déjà discuté des milliers de fois dans le forum Caml.

    La seule réponse vraiment sensée est "******", pour plusieurs raisons :

    - c'est pas géré par OCaml
    - la Caml Team a déjà dit plusieurs fois qu'ils ne l'implanteraient pas, jamais, never, nunca, mai, niekagda (pa ruski...)
    - le faire par fork demande que :
    - l'OS sache le faire
    - que l'algorithme s'y prête
    - que les processus ne communiquent pas trop entre eux, car dans le cas contraire, le gain de temps serait annulé par la perte occasionnée à gérer les communications et les blocages entre processus

    ... et l'argument massu :

    - c'est pas portable

    Donc bon...

  5. #5
    Membre éclairé Avatar de smatador
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 57
    Par défaut
    Tiens, je serai curieux de savoir comment les autres langages fonctionnels prennent en charge ces questions de multithreading/processeurs multi-coeurs.

    PS: Je crois qu'il y a une faute dans le titre : Généralités sur les langages fonctionnelles

  6. #6
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Tiens, je serai curieux de savoir comment les autres langages fonctionnels prennent en charge ces questions de multithreading/processeurs multi-coeurs.
    En F#, c'est facile (certains trouveront tout un tas d'inconvénients, passant par le GC multithread, mais au moins c'est — semble-t-il — portable). Il existe un certain nombre de fonctions pour gérer ça. Pour les entrées/sorties asynchrones, on passe souvent par une monade, qui gère tous les callbacks toute seule.

    Pour lancer un calcul en parrallèle, il y a un type AsyncFuture. Il est exécuté dans un autre thread (un autre coeur, si possible). Et quand le thread principal essaie d'accéder à sa valeur, il attend la fin du calcul. Ca permet de faire une parrallélisation simple, mais qui est insuffisante quand on a de nombreux coeurs.

    Il y a aussi une fonction pour lancer en parrallèle des calculs et qui renvoie un tableau avec tous les résultats. Ca passe par la threadpool de .Net, tout se fait tout seul et tous tes coeurs sont utilisés.

    Ensuite, il existe aussi une mailbox pour gérer les messages entre threads. C'est inspiré du système d'Erlang, à ce qu'il parait. Il y a aussi des bibliothèques .Net qui ne sont pas spécifiques à F#. Je les connais peu.


    Dans les autres langages fonctionnels, Erlang s'en sort assez bien, évidemment. Le reste, je connais mal.

Discussions similaires

  1. multi coeur, multi processeur
    Par bifur dans le forum Programmation d'OS
    Réponses: 2
    Dernier message: 17/02/2011, 15h45
  2. Comment utiliser les doubles comparateurs ?
    Par Whombat dans le forum Langage
    Réponses: 3
    Dernier message: 12/10/2007, 01h21
  3. Comment utiliser ce forum et participer à la FAQ VBA?
    Par khany dans le forum Contribuez
    Réponses: 0
    Dernier message: 04/08/2006, 18h32
  4. Comment utiliser ce forum et participer à la FAQ VB6?
    Par khany dans le forum Vos contributions VB6
    Réponses: 0
    Dernier message: 04/08/2006, 18h21
  5. Réponses: 4
    Dernier message: 24/08/2005, 15h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo