2010-09-17 6 views
0

J'ai un petit programme C++ utilisant OpenMP. Il fonctionne très bien sur Windows7, Core i7 avec VisualStudio 2010. Sur un iMac avec Core i7 et g ++ v4.2.1, le code s'exécute beaucoup plus lentement en utilisant 4 threads qu'avec un seul. Le même comportement "plus lent" est exihibé sur 2 autres machines Red Hat utilisant g ++. Voici le code:OpenMP 'plus lent' sur iMac? (C++)

int iHundredMillion = 100000000; 
    int iNumWorkers = 4; 
    std::vector<Worker*> workers; 

    for(int i=0; i<iNumWorkers; ++i) 
    { 
     Worker * pWorker = new Worker(); 
     workers.push_back(pWorker); 
    } 

    int iThr; 

    #pragma omp parallel for private (iThr)  // Parallel run 
    for(int k=0; k<iNumWorkers; ++k) 
    { 
     iThr = omp_get_thread_num(); 
     workers[k]->Run((3)*iHundredMillion, iThr); 
    } 

Je compile avec g ++ comme ceci:

g++ -fopenmp -O2 -o a.out *.cpp 

Quelqu'un peut-il me dire quelle erreur stupide que je fais sur la plate-forme * nix?

+0

De combien parlons-nous plus lentement? Et avez-vous testé si la même chose se produit en utilisant des threads "réguliers" au lieu de OMP? Comment est défini 'Worker'? (et que fait 'Run', en particulier?) – jalf

+0

Il faut environ 2-3 fois plus de temps pour fonctionner avec * Nix avec OpenMP. Oui, je l'ai testé avec un thread 'régulier' (pas OpenMP). –

+1

@MrTurtle: et le résultat était ...? ;) – jalf

Répondre

-1

Il est impossible de répondre aux informations fournies, mais on peut supposer que votre code est conçu de sorte qu'il ne peut pas être exécuté efficacement sur plusieurs threads.

Je n'ai pas beaucoup travaillé avec OMP, mais je crois qu'il est permis d'utiliser moins de threads de travail que spécifié. Dans ce cas, certaines implémentations pourraient être assez intelligentes pour réaliser que le code ne peut pas être efficacement parallélisé, et l'exécuter sur un seul thread, alors que d'autres naïvement essayer de l'exécuter sur 4 cœurs, et subir la pénalité de performance (due à faux (ou réel) partage, par exemple)

Certaines des informations qui seraient nécessaires afin de vous donner une réponse raisonnable est:

  • les horaires réels (combien de temps le code à prendre courir sur un seul fil? Combien de temps avec 4 threads en utilisant OM? Combien de temps avec 4 threads en utilisant des threads "réguliers"
  • la disposition des données: quelles données sont allouées où, et quand est-il accédé?
  • que se passe-t-il réellement dans la boucle? Tout ce que nous pouvons voir en ce moment est une multiplication et un appel de fonction. Tant que nous ne savons pas ce qui se passe à l'intérieur de la fonction, vous pourriez aussi bien avoir posté ce code: foo(42) et demandé pourquoi il ne renvoie pas le résultat attendu.
+0

Ok, merci pour votre réponse. Le fait que le code fonctionne bien lorsqu'il est compilé avec VisualStudio 2010 (exécuté dans un tiers du temps) en utilisant 4 threads m'a fait penser que le code était correct, mais je l'ai peut-être mal construit avec g ++. –

+0

Il est impossible de dire jusqu'à ce que vous postez votre code. Je devine juste, et je pourrais me tromper complètement. – jalf

2

Je pense que le compilateur g ++ n'optimise pas aussi bien que le compilateur de studio visuel. Pouvez-vous essayer d'autres niveaux d'optimisation (comme -O3) et voir si cela fait une différence?

Ou vous pouvez essayer un autre compilateur. Intel propose des compilateurs gratuits pour Linux à des fins non commerciales.

http://software.intel.com/en-us/articles/non-commercial-software-development/