Meine unmittelbare Vermutung wäre, dass das Problem von der Tatsache herrührt, dass rand()
einen einzelnen Startwert verwendet, der jedes Mal aktualisiert wird, wenn Sie rand()
aufrufen. Dies bedeutet, dass, obwohl es keinen Konflikt zwischen den Arrays gibt, an die Sie schreiben, jeder Aufruf von rand()
wahrscheinlich die Synchronisierung zwischen den Threads erzwingt.
Es gibt verschiedene Möglichkeiten, dies zu umgehen. Ein offensichtlicher wäre die neue Zufallszahl-Erzeugungs Klassen in C++ 11 zu nutzen, mit einem separaten Zufallszahlengenerator-Objekt für jeden Thread, so etwas wie diese:
std::mt19937_64 a;
std::mt19937_64 b;
std::uniform_real_distribution<double> da;
std::uniform_real_distribution<double> db;
#pragma omp parallel for private(a, b)
for (long i = 0; i < N; i++) {
xs[i] = da(a);
ys[i] = db(b);
}
zumindest in einem Schnelltest auf meinem System, das läuft in etwa 4 Sekunden single-threaded, und etwa 1 Sekunde mit OpenMP aktiviert (und das ist auf einem 4-Core-Prozessor, so dass fast perfekt Skalierung ist).
Beachten Sie, wenn Sie auf einem 32-Bit-System sind (oder zumindest einen Compiler verwenden, die 32-Bit-Code erzeugt) dies wahrscheinlich wesentlich schneller sein wird, wenn Sie mt19937
statt mt19937_64
verwenden. Dies wird nur 32 Bits der Zufälligkeit für jede generierte Zahl haben, aber das ist wahrscheinlich so viel wie rand()
produziert sowieso. Auf einem 64-Bit-System/Compiler erwarten Sie, dass mt19937_64
genauso schnell läuft und eine wesentlich größere Zufälligkeit erzeugt.
Eine weitere kleine Anmerkung: hier habe ich nur die Standard-Seed (die 1
ist) für jeden Generator verwendet. Vielleicht möchten Sie Samen nach dem Zufallsprinzip erzeugen, z. B. von std::random_device
, und den Generator jedes Threads separat säen, damit Sie keine Doppelungen von Zahlen zwischen den Threads erhalten.
Auf welcher Plattform sind Sie und was ist der Wert von N? – OMGtechy
Linux (ich dachte, dass das nicht wichtig wäre) und 'N' ist' 500050000'. – drjrm3
Mögliches Duplikat von [Optimierung und warum ist openmp viel langsamer als sequentielle Methode?] (Http://stackoverflow.com/questions/16371541/optimising-and-why-openmp-is-much-slower-than-sequential-way) – OMGtechy