Programmation parallel (ppl.h avec visual studio) (débutant inside)

Programmation parallel (ppl.h avec visual studio) (débutant inside) - C++ - Programmation

Marsh Posté le 04-05-2010 à 09:00:42    

Bonjour à tous,
 
J'ai fait un petit programme en C/C++ que j'essai d'optimiser et en particulier débuter en programmation parallel.
(J'utilise visual studio 2010.)
pour celà j'ai ajouté ppl.h et le namespace concurrency.
 
J'ai voulu tester la fonction parallel_invoke. Seulement mes perfs sont moins bonnes qu'avant ! (par contre je vois bien mes 4 cores utilisés contre un seul auparavant)
Est ce qu'il y des paramètres de compilation particulier à mettre ? doit on spécifier le nombre de core/thread à utiliser ? (gros noob inside :P)
Dans les tutos trouvés sur le net je n'ai pas de réponse :/
 
Merci

Reply

Marsh Posté le 04-05-2010 à 09:00:42   

Reply

Marsh Posté le 04-05-2010 à 09:51:02    

Qu'est ce que t'essaies de paralléliser exactement?

Reply

Marsh Posté le 04-05-2010 à 11:50:36    

deja ppl.h ca sort d'ou ?
ensuite ton algo expose t il du parallelisme latent ? sinon c'est pas la peine.

Reply

Marsh Posté le 04-05-2010 à 13:19:19    

Ca sort de la msdn, http://msdn.microsoft.com/en-us/library/dd492418.aspx, http://msdn.microsoft.com/en-us/library/dd504870.aspx
Je crois qu'il faut pas chercher plus loin pourquoi ça marche pas ^^.

Reply

Marsh Posté le 04-05-2010 à 13:37:07    

snafu8 a écrit :

Ca sort de la msdn, http://msdn.microsoft.com/en-us/library/dd492418.aspx, http://msdn.microsoft.com/en-us/library/dd504870.aspx
Je crois qu'il faut pas chercher plus loin pourquoi ça marche pas ^^.


 
mauvaise langue  :o

Reply

Marsh Posté le 04-05-2010 à 13:52:19    

That's not what she says.

Reply

Marsh Posté le 04-05-2010 à 13:53:58    

ok, non je pense que c'ets bon.  
Je pense plutot que l'algo initial est peu parallelisable ou mal parallelisé.
 
Des details ?

Reply

Marsh Posté le 04-05-2010 à 13:57:20    

snafu8 a écrit :

That's not what she says.


 :o  :o  :o

Reply

Marsh Posté le 04-05-2010 à 20:47:18    

alors voici qq détails (effectivement peut etre ca sert à rien, mais faut bien que j'essaye et que j'apprenne ^^)
en gros j'avais ca (je mets pas les détails) :
#include <ppl.h>
using namespace Concurrency;
 
main
{
.
.
RAZStatut();
reini_value();
if (_modeBlocsActive)  
                    {
                        RAZStatutBlocs();
                        initBlocs();
                 
                    }
}
 
avec
void RAZStatut() {
     
     
    for( myIterator = _AllPieces->begin(); myIterator != _AllPieces->end(); myIterator++ )  
            {
 
             }
...
}
void reini_value(){
 
        for(int i=0;i<_nbPoints;i++)
    {
        _value[i] = _valueRAZ[i];
        }
 
}
 
initBlocs() une autre fonction un peu plus complexe avec qq boucle while
 
j'ai remplacé dans le main par :
parallel_invoke(
                 
                [&](){RAZStatut();},  
                 
                 
                [&](){reini_value();},
 
                [&](){
                    if (_modeBlocsActive)  
                    {
                        RAZStatutBlocs();
                        initBlocs();
                 
                    }
 
                }
            );


Message édité par Boulou le 04-05-2010 à 20:48:12
Reply

Marsh Posté le 04-05-2010 à 22:58:24    

Ouais mais alors en fait, si tu veux, une boucle for ca peut être parallélisable, comme ça peut ne pas l'être, hein, ça dépend des dépendances de données, toussa toussa. Avec ce que tu nous montres, j'ai l'impression que ton code ne fait "que" des remises à zéros et des initialisation de données, des trucs typiquement memory-bound, donc même si c'est parallélisable, ce qui te limite ca va être tes acces mémoires et pas tes temps de calculs.

Reply

Marsh Posté le 04-05-2010 à 22:58:24   

Reply

Marsh Posté le 05-05-2010 à 01:16:29    

si tu passes 2 pauvres cycles par iteration, ca sert en fait bien à rien.
goto lire les bases de la prog parallele :o

Reply

Marsh Posté le 05-05-2010 à 08:16:51    

la taille des boucles est de l'ordre du millier, ici dans ce cas ce n'est pas que des remises à 0 mais c'est effectivement de l'initialisation de données.
 
si je comprends bien il faut mieux // les calculs que les accès mémoires :jap:
 
(dans les tutoriaux que j'ai lu ca ne m'avait pas sauté aux yeux)
 
merci en tout cas pour ces infos

Reply

Marsh Posté le 05-05-2010 à 09:41:29    

Ouais paralléliser des accès mémoire, c'est surtout pas possible (disclaimer : sur des machines normale et pour ce que j'en sais). La remise à zéro c'est juste un cas particulier de l'init de données. Donc en gros dans ce que tu fais, au lieu d'avoir un seul process/thread/whatever, qui va chercher des datas en mémoire, tu en as deux (ou plus) concurrents qui vont tous accéder à la mémoire donc au mieux, rien faire, au pire, se gêner mutuellement (explication avec les mains inside).

Reply

Marsh Posté le 05-05-2010 à 16:42:28    

ca serait aussi bien de savoir ou son tes hotpsot. Tu parallelise pas tout comme un clebard, faut reflechir un peu :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed