Die OpenMP-threads auf der selben cpu-Kern

Ich bin derzeit Programm zu parallelisieren mit openmp auf einem 4-core phenom2. Jedoch bemerkte ich, dass meine Parallelisierung tut man nicht alles für die performance. Natürlich habe ich angenommen, habe ich etwas verpasst (falsesharing, Serialisierung durch Schleusen, ...), aber ich war nicht in der Lage zu finden, etwas. Außerdem wird von der CPU-Auslastung, schien es, wie das Programm ausgeführt wurde, nur auf einem core. Aus dem, was ich sched_getcpu() sollte mir die Id der Kern der thread ausführen, der Aufruf wird derzeit geplant. Also schrieb ich das folgende test-Programm:

#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;
    }
}

Auf meinem Rechner dies gibt die folgende Ausgabe(die Zufallszahlen variieren natürlich):

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

Von diesem ich gehe davon aus, dass alle threads ausführen auf dem gleichen Kern (mit id 0). Um mehr Sicherheit ich habe auch versucht, den Ansatz von diese Antwort. Die Ergebnisse, wo das gleiche. Zusätzlich mit #pragma omp parallel num_threads(1) nicht machen, die Ausführung langsamer (etwas schneller, in der Tat), Kreditvergabe Glaubwürdigkeit der Theorie, dass alle threads die gleiche cpu, jedoch ist die Tatsache, dass die cpu immer angezeigt, wie 0 macht mich irgendwie misstrauisch. Zusätzlich habe ich überprüft GOMP_CPU_AFFINITY wurde zunächst nicht festgelegt ist, also ich habe versucht, es zu 0 1 2 3, die gebunden werden muss jeder thread auf einem anderen Kern von dem, was ich verstehe. Jedoch, dass nicht einen Unterschied machen.

Da die Entwicklung auf einem windows-system habe, verwende ich linux in virtualbox für meine Entwicklung. Also ich dachte, dass vielleicht das virtuelle system konnte nicht auf alle Kerne. Aber die überprüfung der Einstellungen von virtualbox zeigte sich, dass die virtuelle Maschine bekommen soll alle 4 Kerne und die Ausführung meiner test-Programm 4 mal zur gleichen Zeit scheint die Verwendung aller 4 Kerne zu urteilen, ist die cpu-Auslastung (und die Tatsache, dass das system sehr standfest).

Also, meine Frage ist im Grunde, was genau Los ist hier. Mehr auf den Punkt:
Ist mein Abzug, dass alle threads die gleiche core-richtig? Wenn es ist, was könnten die Gründe für dieses Verhalten?

  • hier ist ein allgemeiner Fehler, hast du die Umgebungsvariable OMP_NUM_THREADS =4?
  • OMP_NUM_THREADS scheint nicht eingestellt zu sein, aber da openmp erstellt 4 threads, die ich glaube nicht, dass ich brauchen würde.
  • komisch, ich denke, es könnte etwas werden mit der virtuellen Maschine habe ich versucht den gleichen code noch installiert utmpx.h und es schien zu funktionieren, auf eine 8 und eine 16-core-Maschine
  • Ich habe irgendwo gelesen, dass die virtuelle Maschine (guest OS) läuft als einzelner Prozess in Ihrem host-Betriebssystem. Könnte dies die Ursache für das Verhalten, das Sie sehen?
  • Das gleiche passiert mir auf einem 2-CPU x86-64-server mit Scientific Linux 6. Keine IDE-oder eine virtuelle Maschine in Sicht.
InformationsquelleAutor Grizzly | 2012-02-21
Schreibe einen Kommentar