OpenMP les threads s'exécutant sur le même processeur core

Je suis actuellement à la parallélisation du programme en utilisant openmp sur un 4-core phenom2. Cependant, j'ai remarqué que mon parallélisation ne fait rien pour la performance. Naturellement, j'ai supposé que j'ai raté quelque chose (falsesharing, la sérialisation dans les écluses, ...), cependant, j'ai été incapable de trouver quoi que ce soit. En outre, de l'Utilisation de l'UC, il semblait que le programme a été exécuté sur un seul core. De ce que j'ai trouvé sched_getcpu() devrait me donner l'Id de la base au fil de l'exécution de l'appel est actuellement prévue. J'ai donc écrit le programme de test suivant:

#include <iostream>
#include <sstream>
#include <omp.h>
#include <utmpx.h>
#include <random>
int main(){
    #pragma omp parallel
    {
        std::default_random_engine rand;
        int num = 0;
    #pragma omp for
        for(size_t i = 0; i < 1000000000; ++i) num += rand();
    auto cpu = sched_getcpu();
    std::ostringstream os;
        os<<"\nThread "<<omp_get_thread_num()<<" on cpu "<<sched_getcpu()<<std::endl;
        std::cout<<os.str()<<std::flush;
    std::cout<<num;
    }
}

Sur ma machine cela donne le résultat suivant(les nombres aléatoires varient bien sûr):

Thread 2 on cpu 0 num 127392776
Thread 0 on cpu 0 num 1980891664
Thread 3 on cpu 0 num 431821313
Thread 1 on cpu 0 num -1976497224

De cette je suppose que tous les threads s'exécutent sur le même noyau (le noyau de l'un avec l'id 0). Pour être plus certain, j'ai aussi essayé l'approche de cette réponse. Les résultats sont les mêmes. De plus, en utilisant #pragma omp parallel num_threads(1) ne pas rendre l'exécution plus lente (un peu plus rapide en fait), qui donne de la crédibilité à la théorie que tous les threads utilisent le même processeur, cependant, le fait que le processeur est toujours affiché comme 0 me fait une sorte de suspect. De plus j'ai vérifié GOMP_CPU_AFFINITY qui était initialement pas ensemble, donc j'ai essayé de le définir à 0 1 2 3, qui devrait lier chaque thread à un autre noyau de ce que je comprends. Cependant, cela ne voulait pas faire une différence.

Depuis développer sur un système windows, j'utilise linux avec virtualbox pour mon développement. Donc j'ai pensé que peut-être le système virtuel ne pouvais pas accéder à tous les cœurs. Cependant, la vérification des paramètres de virtualbox a montré que la machine virtuelle doit obtenir tous les 4 cœurs et de l'exécution de mon programme de test 4 fois dans le même temps semble utiliser les 4 coeurs à en juger par l'utilisation du processeur (et le fait que le système a été très ne répond pas).

Donc pour ma question est essentiellement ce qui se passe exactement ici. Plus au point:
Est ma déduction que tous les threads de même correctement? Si elle l'est, ce qui pourrait être les raisons de ce comportement?

heres une erreur commune avez-vous définissez la variable d'environnement OMP_NUM_THREADS =4?
OMP_NUM_THREADS ne semble pas être ensemble, mais depuis, openmp permet de créer 4 threads, je ne pense pas que j'aurais besoin.
bizarre je pense qu'il pourrait être quelque chose avec votre machine virtuelle, j'ai essayé le même code, même installé utmpx.h et il semblait bien fonctionner sur un 8 et 16 de base de la machine
J'ai lu quelque part que la machine virtuelle (OS invité) s'exécute comme un processus unique, à l'intérieur de votre système d'exploitation hôte. Cela pourrait-il être la cause du comportement que vous voyez?
La même chose se passe pour moi sur les 2 CPU x86-64 serveur avec Scientific Linux 6. Aucune IDE de la machine virtuelle ou en vue.

OriginalL'auteur Grizzly | 2012-02-21