Boucles parallèles en C++
Je me demande si il y a une lumière, droite, avant de calculer les boucles comme pour et basé sur des boucles en parallèle en C++. Comment voulez-vous mettre en œuvre une telle chose? Scala je sais que la carte, filtre et foreach fonctions peut-être il serait également possible d'effectuer ces parallèles? Est-il un moyen facile de mettre cela en C++.
Mon principal plattform est Linux, mais ce serait bien si cela fonctionne de la croix-plattform.
à l'aide de threads est une bonne option.
N'est-il pas vraiment cher pour initialiser les threads?
Que de les comparer à l'appel fork (). Les Threads ne sont pas chers car ils se partagent les ressources du thread principal sauf qu'ils ont leur propre PC, registres et de la pile.
Ils sont légers.
Vous devez les initialiser fils; comment vous voulez atteindre le parallélisme? Ok, il y a d'autres moyens, tels que la vectorisation, mais il est probable fournie automatiquement par un compilateur, si vous optimisez construit.
N'est-il pas vraiment cher pour initialiser les threads?
Que de les comparer à l'appel fork (). Les Threads ne sont pas chers car ils se partagent les ressources du thread principal sauf qu'ils ont leur propre PC, registres et de la pile.
Ils sont légers.
Vous devez les initialiser fils; comment vous voulez atteindre le parallélisme? Ok, il y a d'autres moyens, tels que la vectorisation, mais il est probable fournie automatiquement par un compilateur, si vous optimisez construit.
OriginalL'auteur Exagon | 2016-03-27
Vous devez vous connecter pour publier un commentaire.
Qu'est-ce que votre plate-forme? Vous pouvez regarder OpenMP, si ce n'est pas une partie de C++. Mais il est largement soutenu par les compilateurs.
Comme pour la gamme à base de boucles, voir, par exemple, En utilisant OpenMP avec C++11 gamme à base de boucles for?.
J'ai aussi vu quelques documents à http://www.open-std.org qui indiquent des efforts pour intégrer les constructions parallèles/algorithmes dans l'avenir en C++, mais ne savent pas quel est leur état actuel.
Mise à JOUR
Simplement en ajoutant quelques exemplaires code:
Le nombre de threads peut être réglé au moment de l'exécution par le
OMP_NUM_THREADS
variable d'environnement.De quoi êtes-vous parcourir? Pouvez-vous utiliser les index pour faire une boucle?
Il dépend de vous que en quoi vous prenez le travail de threads. Vous pouvez faire des conditions dans les boucles qui vous permet de diviser le travail.
Oui ça serait bien si cela fonctionne avec la gamme de base, mais je peux également accéder aux données via des index
Avec
RandomAccessIterator
s, vous pouvez travailler avec des décalages dans la boucle et ensuite accéder à des éléments comme*(container.begin()+i)
.OriginalL'auteur Daniel Langr
Avec le parallèle des algorithmes en C++17 nous pouvons maintenant utiliser:
pour calculer les boucles en parallèle. Le premier paramètre spécifie le l'exécution de la politique
Le compilateur Intel C++, si vous êtes un étudiant, vous pouvez l'obtenir gratuitement.
est mis en œuvre dans Microsoft VS 2017 15.5, voir blogs.msdn.microsoft.com/vcblog/2017/12/19/...
bon à savoir, merci
OriginalL'auteur Exagon
std::async
peut être un bon ajustement ici, si vous êtes heureux de laisser laC++
exécution de contrôler le parallélisme.Exemple de l'cppreference.com:
est-il de la documentation sur la façon dont c++ gère les tâches en parallèle et asyncs?
Le premier paramètre à
std::async()
précise ce qu'est la liberté de vous donner le cadre (surtout si vous permettez à l'aide de la thread de premier plan). Quant à ce qu'il fait pour le fond - c'est le compilateur spécifique, mais plus probablement sur la plupart des compilateurs, il y aura un singleton pool de threads avec N=nombre de cœurs de PROCESSEUR sur la boîte. Meilleure utilisation de la documentation je suis venu de la croix jusqu'à présent est la simultanéité chapitre de la dernière Mayer du livre.Considérant que
async
va lancer un nouveau thread à chaque fois, cette solution n'est pas de manière affective. allez-vous frayer 1000 nouveaux threads, chacun a une pile de 1 MO de pile ?si async engendre un thread ou utilise un fond de la piscine est mise en œuvre spécifique (mais oui, avec GCC, il ne spawn). Personne ne dit à propos de la ponte 1000s de threads, évidemment (bien que sur une boîte avec 1000s de Cpu - pourquoi pas), mais se reproduit un peu. l'exécution de plusieurs secondes dans chaque et la résiliation d'entre eux peuvent être en vaut la peine. Tout dépend des spécificités du problème.
OriginalL'auteur bobah
Cela peut être fait en utilisant
threads
spécifiquementpthreads
fonction de bibliothèque qui peut être utilisée pour effectuer des opérations en même temps.Vous pouvez en lire plus à ce sujet ici : http://www.tutorialspoint.com/cplusplus/cpp_multithreading.htm
std::thread peut également être utilisé : http://www.cplusplus.com/reference/thread/thread/
Ci-dessous est un code que j'utilise l'id de thread de chaque fil de diviser le tableau en deux moitiés :
Rappelez-vous aussi lors de la compilation, vous devez utiliser le
-lpthread
drapeau.Lien vers la solution sur Ideone : http://ideone.com/KcsW4P
start index
et laend index
dans la fonction que vous utilisez et de modifier en conséquence pour chaque thread à utiliser.Le
pthread_create
fonction prend un argument qui contient le nom de la fonction que vous voulez que votre threads à utiliser, vous pouvez modifier ces fonctions arguments pour obtenir le résultat souhaité.pourquoi le ferait-il utiliser les pthreads quand il a
std::thread
?Haim je l'ai suggéré dans la réponse qu'il peut aussi utiliser
std::thread
.OriginalL'auteur uSeemSurprised
Avec C++11, vous pouvez paralléliser une boucle for avec seulement quelques lignes de codes.
Cette fend d'une boucle for dans de plus petits morceaux et d'attribuer à chaque sous-boucle à un fil:
Ou au sein d'une classe:
Pour ce faire, il vous suffit de mettre le code ci-dessous dans un fichier d'en-tête et de l'utiliser à volonté:
Enfin, vous pouvez définir une macro pour obtenir encore plus compact expression:
OriginalL'auteur arkan
La Simultanéité::parallel_for (PPL) est également une des belles opions à faire le parallélisme des tâches.
Prises de Le C++ Exercice Parallèle De – Monte-Carlo PI Calcul
OriginalL'auteur Zhihua Lai