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

C++ Discussion :

Vector, threads et mutex sur valeurs distinctes


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Enseignant
    Inscrit en
    Septembre 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 43
    Points : 46
    Points
    46
    Par défaut Vector, threads et mutex sur valeurs distinctes
    Bonjour à tous.

    j'ai un traitement à faire sur deux vecteurs :
    - l'un en entrée VectorI
    - l'autre en sortie VectorO

    et une fonction f qui permet pour un élément k de VectorI[k] de passer à VectorO[k]

    Ma taille de vecteur étant de 15.000 éléments environs, j'applique ma fonction f 15.000 fois pour calculer VectorO à partir de VectorI
    Comme le traitement de f est indépendant des éléments de VectorI et vectorO, je me suis dis que je pourrais lancer 4 threads par exemple pour accélérer le traitement de la fonction f.

    genre:
    thread1 s'occupe des éléments de 0 à 3750
    thread2 s'occupe des éléments de 3751 à 7500
    thread3 s'occupe des éléments de 7501 à 11250
    thread4 s'occupe des éléments de 11251 à 15000

    Question (bête):
    Je sais que je dois poser des mutex normalement pour accéder aux lectures/écritures des deux vector.
    Mais dans mon cas, je suis sûr que les threads ne créerons jamais de collisions (lire un truc que l'autre thread doit modifier) , dois je quand même poser des mutex ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    Sauf si j'ai compris de travers, non, vous n'avez pas besoin de mutex, si vous gérez correctement les types de données utilisés.
    Là, vous êtes dans du traitement parallèle car vous appliquez la même fonction au même moment sur des jeux de données indépendant.
    Généralement, on préfère résoudre ce type d'optimisation par l'utilisation d'instructions parallèles plutôt que par des threads indépendants, plus gourmands en ressources.

    Si vous avez un std::array en entrée, les lectures peuvent être parallèles.

    Si vous avez une std::list en sortie, ça le fera pas.
    Si vous avez un std::vector en sortie, mais avec une taille non déjà fixé à la bonne valeur, ça le fera pas.
    Si vous avez un std::vector en sortie, mais avec une taille déjà fixé à la bonne valeur, ou un std::array ça le fera.

    je suis sûr que les threads ne créerons jamais de collisions (lire un truc que l'autre thread doit modifier)
    Mais faites aussi attention aux contentions sur le cache.
    Il faut que le placement des données en mémoire fasse en sorte que les lectures/écritures utilisent correctement le cache (pas de cache-miss, pas de verrouillage de ligne de cache, etc...).
    Il n'y pas de solution toute faite, c'est fonction de appariement entre les caches et les threads(virtuel ou pas) dans les CPU.

  3. #3
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 460
    Points : 6 064
    Points
    6 064
    Par défaut
    Bonjour,

    Comme l'a dit bacelar, pas besoin de mutex.

    Personnellement, je te conseille de regarder du côté de std::async.

    Dans la FAQ C++ de isocpp.org, il y a justement un un exemple avec std::async pour faire potentiellement 4 traitements en parallèle sur un std::vector :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
            template<class T, class V> struct Accum  {  // simple accumulator function object
                T* b;
                T* e;
                V val;
                Accum(T* bb, T* ee, const V& v) : b{bb}, e{ee}, val{vv} {}
                V operator() () { return std::accumulate(b,e,val); }
            };
            double comp(vector<double>& v)
                // spawn many tasks if v is large enough
            {
                if (v.size()<10000) return std::accumulate(v.begin(),v.end(),0.0);
                auto f0 {async(Accum{&v[0],&v[v.size()/4],0.0})};
                auto f1 {async(Accum{&v[v.size()/4],&v[v.size()/2],0.0})};
                auto f2 {async(Accum{&v[v.size()/2],&v[v.size()*3/4],0.0})};
                auto f3 {async(Accum{&v[v.size()*3/4],&v[v.size()],0.0})};
                return f0.get()+f1.get()+f2.get()+f3.get();
            }
    Remarque : Dans le code ci-dessus, le compilateur ne créera pas forcément des threads. Mais tu peux le forcer avec std::launch::async en premier paramètre de std::async.

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Si l'utilisation d'OpenMP est envisageable, ça s'écrit en quelques lignes avec un parallel for.

Discussions similaires

  1. [2012] Somme sur les valeurs distinctes d'une dimension
    Par Xtream071 dans le forum SSAS
    Réponses: 6
    Dernier message: 25/04/2014, 12h55
  2. Comment récuperer la liste de valeurs distinctes sur un range Excel ?
    Par braguy13 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/01/2011, 18h58
  3. Somme des valeurs distinctes sur 3 tables
    Par bugs74 dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/12/2010, 16h44
  4. Lister les valeurs distinctes présentes sur plusieurs feuilles
    Par neupont dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/06/2008, 11h42
  5. Choix d'un Index sur un champ ayant peu de valeurs distincts
    Par cfeltz dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 25/04/2007, 09h35

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