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

Threads & Processus C++ Discussion :

[TBB] Possible sans coder des threads et en ne lançant qu'une instance de programme ?


Sujet :

Threads & Processus C++

  1. #1
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut [TBB] Possible sans coder des threads et en ne lançant qu'une instance de programme ?
    Bonjour,

    J'ai un calcul plutôt lourd (qui correspondrait grossièrement à une double boucle for imbriquée) à effectuer, et j'aimerais profiter de l'octocoeur présent sur la machine client pour réduire le temps de traitement au maximum.

    Je ne connais pas grand-chose à la programmation threadée, je me demandais donc si la bibliothèque TBB d'Intel permettrait à mon programme, monoinstance et sans déclaration de threads, d'effectuer des calculs parallèles sans modification majeure (tout ce qui est langage, ok, mais si on va plus loin dans la gestion de threads, je serai probablement perdu).

    Edit: J'ai Boost à ma disposition. Visiblement, boost::threads n'a pas l'air bien compliqué, mais est-ce que la déclaration de plusieurs threads les fait exécuter automatiquement (donc sans TBB) sur tous les coeurs disponibles ?

    Qu'en pensez-vous ?

    Merci d'avance.

    Cordialement,

    Kidpaddle2

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je crois que tu devrais jeter un œil à OpenMP, auparavant.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Pour ce genre de choses, openMP ou TBB sont probablement de meilleurs choix que boost::thread, puisque ce dernier demande à gérer les threads manuellement.

    Après, pour ce qui est des modifications majeures, ça dépend de la nature de ce que tu fais dans tes boucles. En particulier, est-ce que tu accèdes en écriture à de la mémoire dans ta boucle ? Si oui, est-ce la même zone mémoire d'une itération à l'autre, ou bien chaque itération a-t-elle sa propre mémoire bien définie ?

  4. #4
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Merci de vos réponses. J'avais effectivement entendu de OpenMP, mais je me demandais si c'était réellement efficace...

    Finalement, je me suis renseigné en parallèle pour un sujet complémentaire et il s'est avéré qu'il a dérivé sur le coeur de celui-ci ; ma conclusion : je dois créer plusieurs threads qui ouvriront des fichiers en parallèle.

    Par contre, pour écrire par blocs plutôt que ligne par ligne (ce qui est nettement plus rapide), j'aurai de toutes manières un double for à faire. Me conseillez-vous donc TBB ou OpenMP ? Il s'agit tout simplement d'une combinaison linéaire... Donc en théorie, oui, il y aurait partage en écriture sur le tableau de sortie/résultat.

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    De manière générale, dés que tu as une donnée partagée à laquelle tu dois accéder en écriture / modification dans un thead, tu dois veiller à ce que cette écriture / modification soit, au minimum, protégée par un mutex et sans doute par du "double checking".

    En effet, si tu ne prend pas cette précaution élémentaire, de te trouver dans une situation dans laquelle deux (ou plusieurs) threads risquent de vouloir... modifier la variable partagée en même temps, avec des résultats parfois surprenants.

    Ce qui semble donc le plus intéressant est donc:
    1- de créer une file de gestion des informations à écrire. Cette file peut être alimentée par plusieurs threads (seul le "raccordement" des nouveaux éléments devant être protégé par rapport à des accès concurrents).

    2- d'utiliser un thread unique qui se chargera d'écrire dans un fichier le contenu de la file définie plus haut.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    De manière générale, dés que tu as une donnée partagée à laquelle tu dois accéder en écriture / modification dans un thead, tu dois veiller à ce que cette écriture / modification soit, au minimum, protégée par un mutex et sans doute par du "double checking".

    En effet, si tu ne prend pas cette précaution élémentaire, de te trouver dans une situation dans laquelle deux (ou plusieurs) threads risquent de vouloir... modifier la variable partagée en même temps, avec des résultats parfois surprenants.

    Ce qui semble donc le plus intéressant est donc:
    1- de créer une file de gestion des informations à écrire. Cette file peut être alimentée par plusieurs threads (seul le "raccordement" des nouveaux éléments devant être protégé par rapport à des accès concurrents).

    2- d'utiliser un thread unique qui se chargera d'écrire dans un fichier le contenu de la file définie plus haut.

    Salut, je suis moi aussi en train de faire mes armes en progra multithreadée et c'est un peu rude je dois dire! Koala01, je crois que tu mets le doigt sur un problème que je rencontre directement: estce que tu voudrais bien poser ici un cas-type d'illustration de ton ton intro sur la question du partage de variables ("situation dans laquelle deux (ou plusieurs) threads risquent de vouloir... modifier la variable partagée en même temps") et des points 1. et 2. suivants? En particulier je voudrais mieux saisir ce que tu appelles "file de gestion" car je ne vois pas du tout. Je fais sinon moi le choix d'utiliser TBB. J'ai vu sous Boost l'utilisation des "Mutex", mais pas sous TBB. Comment se gère la synchro avec cette librairie? Merci et@ +

  7. #7
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Jette un coup d'oeil à ce lien : http://www.justsoftwaresolutions.co....variables.html

    En faisant hériter tes threads de cette classe, tu as une file de gestion !

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/06/2010, 11h03
  2. Est-il possible de créer des graphiques sans GD ?
    Par espadon1 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 01/11/2006, 22h59
  3. [MySQL] Est-ce possible de creer des champs en temps réel lors d'une requête SQL ?
    Par kaptnkill dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/09/2006, 19h18
  4. [CR] Est il possible de créer des univers avec Seagate Info?
    Par Frank dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/06/2002, 15h22

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