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 éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    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 émérite
    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
    Points : 2 990
    Points
    2 990
    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é.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    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 éprouvé
    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
    Points : 1 284
    Points
    1 284
    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...
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  5. #5
    Membre régulier 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
    Points : 78
    Points
    78
    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 expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    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, 14h45
  2. Comment utiliser les doubles comparateurs ?
    Par Whombat dans le forum Langage
    Réponses: 3
    Dernier message: 12/10/2007, 00h21
  3. Comment utiliser ce forum et participer à la FAQ VBA?
    Par khany dans le forum Contribuez
    Réponses: 0
    Dernier message: 04/08/2006, 17h32
  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, 17h21
  5. Réponses: 4
    Dernier message: 24/08/2005, 14h09

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