2010-11-03 8 views
1

J'ai une bibliothèque de classes C++ qui utilise omp pour la parallélisation. J'ai remarqué mon problème quand il a toujours utilisé tous les cœurs sur mon processeur et pas ce que omp_set_num_threads (threadCount) avait comme entrée.omp_set_num_threads renvoie toujours 0 et je n'arrive pas à obtenir le thread num avec omp_get_thread_num()

Alors, quand investegating je réalise que la seule façon d'obtenir num_threads au travail était de ne pas utiliser la méthode omp_set_num_threads(), mais mis num_threads sur la directive parallèle comme ceci:

#pragma omp parallel num_threads(4) 
{ 
    int i = omp_get_thread_num(); 
    printf_s("Hello from thread %d\n", i); 
} 

Dans le cas ci-dessus la sortie est:

Hello from thread 0 
Hello from thread 0 
Hello from thread 0 
Hello from thread 0 

Si je place ce qui suit:

omp_set_num_threads(4); 
#pragma omp parallel //num_threads(4) 
    { 
     int i = omp_get_thread_num(); 
     printf_s("Hello from thread %d\n", i); 
    } 

La sortie est

Hello from thread 0 
Hello from thread 0 
Hello from thread 0 
Hello from thread 0 
Hello from thread 0 
Hello from thread 0 
Hello from thread 0 
Hello from thread 0 

Cependant, j'ai créé un nouveau projet de type Application console Win32 les works de omp_set_num_threads et je reçois la sortie:

Bonjour de fil 0 Bonjour de fil 2 Bonjour du fil 1 Bonjour à partir du fil 3

Je dois penser que cela a à voir avec le type de projet ou un paramètre sur le projet. Est-ce que quelqu'un sait ce que cela pourrait être?

Meilleures salutations Richard

+0

Je dois ajouter aussi que je le drapeau/OpenMP fixé – Richard

Répondre

0

OMP est pas obligé de paralléliser votre code de quelque façon que ce soit. Il pourrait bien juger qu'il est inutile de paralléliser un tel code court - d'autant plus que printf ne contient pas de garanties de threads et que l'exécution de travaux de blocage en parallèle est un anti-pattern. Lorsque vous traitez des threads, des extraits courts comme celui-ci ne sont jamais indicatifs de quoi que ce soit.

+0

C'est juste un code raccourci pour plus de clarté, j'ai un code plus complexe parallèle. Je n'ai toujours pas le numéro de thread de omp_get_thread_num() – Richard

0

Je résolu le problème maintenant, donc ce fil peut être fermé, à moins que quelqu'un peut répondre à pourquoi cette happends, explication suivante:

Le problème que j'avais été la propriété Common Language Runtime Support dans les pages de propriétés de mon C++ Le projet a été défini sur Aucun support de Common Language Runtime. Nous avons changé cela car Visual Studio 2010 ne prenait pas en charge IntelliSense pour les applications C++ avec ce paramètre défini sur "Common Language Runtime Support". Mais il semble que le réglage est nécessaire pour que le filetage fonctionne comme je l'ai expliqué ci-dessus.

Quelqu'un sait pourquoi?

Meilleures salutations Richard