Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Le C++ est-il adapté pour le développement parallèle ?

Le , par Alp

7PARTAGES

0  0 
Bonsoir,

Selon vous, C++ fait-il partie des langages les plus adaptés pour le multithreading et la programmation parallèle, sujet au coeur de la recherche et des évolutions aujourd'hui ? Quels sont les meilleurs outils pour en tirer au mieux parti ?

N'hésitez pas à argumenter, bien au contraire

PS : voici quelques discussions qui se rapportent au développement parallèle en C++
http://www.developpez.net/forums/d74...rallel-studio/
http://www.developpez.net/forums/d74...-parallelisme/

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de Matthieu Brucher
Rédacteur https://www.developpez.com
Le 23/05/2009 à 9:50
Beaucoup de frameworks existent pour le C++ permettant la programmation parallèle. Ils sont tous plus ou moins efficaces :
- OpenMP
- MPI
- TBB
- wxWidgets
- Qt
- ...

Bref, très efficace. Et avec les fonctions lambda, ça va encore aller en s'améliorant.
0  0 
Avatar de JolyLoic
Rédacteur/Modérateur https://www.developpez.com
Le 23/05/2009 à 10:31
Déjà, j'aimerais distinguer 3 types de multithreading :
- Pour les performances (exploiter un matériel multi-cœurs)
- Pour la réactivité (une IHM qui reste réactive quand le calcul s'éxécute, un programme gérant en temps réel des évènements extérieurs)
- Pour l'isolation (un serveur web isolant les différentes réponses à différentes requêtes)

Je pense que la question était particulièrement orientée vers le parallélisme pour la performance, qui est en effet d'actualité de nos jours.

Pour la question, aujourd'hui, je dirais non car :
- Le comportement multithread du C++ est platform dependant
- Il n'y a rien de standard pour gérer les threads, les locks...
- Il n'y a rien qui permette de remonter une exception depuis un thread vers le thread l'ayant lancé
- La notion de fonction pure qui permettrait d'aider une parallélisation automatique n'existe pas
- La syntaxe pour désigner une action est lourde (pas de lambda-expression)
- C'est un langage impératif, qui plus est où la possibilité d'aliasing est omniprésente, rendant la parallélisation difficile.

L'avantage, c'est qu'à part le dernier point, tous sont adressés par C++0x

Et comme d'un autre côté, le C++ est un langage qui est orienté performances, il me semble naturel que que faire de la performance grâce au parallélisme se base déjà sur le fait de faire de la performance tout court.

Autre point positif, le C++ est un langage où tout est fait pour permettre de bâtir des niveaux d'abstraction élevés à partir de couches bas niveau, sans que cette abstraction ait un coût trop important. Threads et lock sont des primitives bas niveau. Des bibliothèques comme TBB sont d'un niveau un peu plus élevé. Tout un niveau où le parallélisme devient non plus explicite mais implicite reste à construire.
0  0 
Avatar de Matthieu Brucher
Rédacteur https://www.developpez.com
Le 23/05/2009 à 11:11
Citation Envoyé par JolyLoic Voir le message
Et comme d'un autre côté, le C++ est un langage qui est orienté performances, il me semble naturel que que faire de la performance grâce au parallélisme se base déjà sur le fait de faire de la performance tout court.
Certains diront qu'il manque à ce niveau la possibilité de supprimer l'aliasing de pointeurs
0  0 
Avatar de Arzar
Membre émérite https://www.developpez.com
Le 23/05/2009 à 12:13
Citation Envoyé par JolyLoic Voir le message

- La notion de fonction pure qui permettrait d'aider une parallélisation automatique n'existe pas.
[...]
- C'est un langage impératif...

L'avantage, c'est qu'à part le dernier point, tous sont adressés par C++0x
Des fonctions pures ?
Je ne me souviens pas avoir vu passer de proposition pour ça et la recherche du mot "pure" dans le draft de mars ne donne rien (sauf des références aux fonctions virtuelles pures)
Est-ce une exclu pour developpez ?
Aurais-tu quelques détails ?
0  0 
Avatar de JolyLoic
Rédacteur/Modérateur https://www.developpez.com
Le 24/05/2009 à 11:58
Citation Envoyé par Arzar Voir le message
Des fonctions pures ?
Je ne me souviens pas avoir vu passer de proposition pour ça et la recherche du mot "pure" dans le draft de mars ne donne rien (sauf des références aux fonctions virtuelles pures)
En fait, j'ai été un peu trop enthousiaste...
L'idée n'est pas forcément d'avoir une gestion par le standard de fonctions pures, mais de permettre à des compilateurs de gérer la notion de fonction pure. Mais cette idée fait débat.

En gros, il y a une proposition sur les attributs, et parmi les exemples d'attributs, l'un des plus cités est un attribut pure pour les fonctions. Mais les attributs seraient en grande partie non standards, juste des points d'expansion pour les compilateurs. http://www.open-std.org/jtc1/sc22/wg...2008/n2553.pdf
0  0 
Avatar de Goten
Membre chevronné https://www.developpez.com
Le 24/05/2009 à 12:24
Sinon, en quoi les lambdas vont dans le sens de la programmation parallèle? (dans ma tête le mécanisme mis en oeuvre part le compilo revient à créer un foncteur)
0  0 
Avatar de Matthieu Brucher
Rédacteur https://www.developpez.com
Le 24/05/2009 à 12:34
On a souvent besoin de ce genre de fonctions/foncteurs/... pour le parallélisme. Ca permet donc de réduire le nombre de lignes à écrire. Ou de ne pas les appeler en-dehors d'un framework.
0  0 
Avatar de JolyLoic
Rédacteur/Modérateur https://www.developpez.com
Le 24/05/2009 à 13:27
On y gagne en nombre de lignes à écrire, mais aussi en localité du code, et en besoin de trouver un nom.

Si j'ai une fonction :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
void f()
{
  vector<double> v;
  // ... 
  for(auto it = v.begin() ; it != v.end() ; ++it)
  {
    *it = 2*g(*it);
  }
  // ...
}
Et que je désire remplacer le for par un parallel_for, avec un simple foncteur, je dois écrire :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct ApplyGAndDoubleResult // nom pas forcément bien choisi, de plus, on ne sait pas trop où cette classe va servir
{
  double operator()(double d)
  {
    return 2*g(d);
  }
}; // Pas mal de lignes de code

void f()
{
  vector<double> v;
  // ... 
  // On est obligé d'aller regarder ailleur pour voir ce qui se passe dans la boucle
  parallel_for(v.begin(), v.end(), ApplyGAndDoubleResult ());
  // ...
}
Avec des lambdas, on se retrouve bien plus proche du code initial :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
void f()
{
  vector<double> v;
  // ... 
  parallel_for(v.begin(), v.end(), [](double d)
  {
      return 2*g(d);
  });
  // ...
}
0  0 
Avatar de Goten
Membre chevronné https://www.developpez.com
Le 24/05/2009 à 15:13
Ahhh d'accord, je pensais que les lambdas permettrait des optimisations derrière pour du MT. Mais en fait non c'est par rapport à la compréhension du code. C'est le sens que j'avais pas compris.
0  0 
Avatar de Aurelien.Regat-Barrel
Expert éminent sénior https://www.developpez.com
Le 09/08/2009 à 17:07
Citation Envoyé par JolyLoic Voir le message
- Il n'y a rien qui permette de remonter une exception depuis un thread vers le thread l'ayant lancé
Je ne comprends pas le fonctionnement / usage. Chaque thread ayant sa propre pile, et les exceptions remontant cette pile, comment ça marche / s'utilise ?
0  0