omp ordered und array
-
Hallo,
ich habe eine for-Schleife ueber eine int-Variable, die ich mit
#pragma omp parallel for orderedparallelisieren kann, da die eigentlichen Berechnungen unabhaengig voneinander sind. Nur das jeweilige Ergebnis speichere ich als Objekt ein einem std::vector. Um Speicherprobleme bei der Parallelisierung zu verhinden, musste ich das "vec.push_back(object)" mit
#pragma omp orderedeinbetten.
Wenn ich den Platz fuer den vector vorher anfordere, koennte ich natuerlich per index darauf zugreifen und so das
#pragma omp orderedvermeiden, da es keine zeitgleichen Zugriffe auf den gleichen Speicherbereich geben wuerde.
Meine Frage: Lohnt sich dieser Weg, oder ist ein Compiler (bei mir gnu gcc) schlau genug, dieses 'ordered' entsprechen zu handhaben?
P.S.: Dies sind meine ersten Gehversuche mit openmp, kann sein, dass es zu meiner Frage einen ganz anderen, besseren Zugang gibt, der mir nur noch nicht bekannt ist.
-
Wieso ordered? Ich habs so verstanden
int main() { const size_t num = 100; std::vector<int> results(num); #pragma omp for for (size_t i = 0; i < num; ++i) { results[i] = i*i; } return 0; }
-
tim_g schrieb:
Meine Frage: Lohnt sich dieser Weg,
Na klar, genau so etwas wie omp ordered will man ja vermeiden! Und die Nachteile hier sind 0.
oder ist ein Compiler (bei mir gnu gcc) schlau genug, dieses 'ordered' entsprechen zu handhaben?
Wie sollte er? Es gibt ja einen Grund warum du für das push_back ein omp ordered brauchst. Da kann der Compiler auch nichts dran machen. Das Programmverhalten ist definiertermaßen ein ganz anderes wenn du die Elemente vorher anlegst anstatt sie mit push_back anzuhängen.
-
Vielen Dank! Hab's mittlerweile auch mal ausprobiert, und der Unterschied ist tatsaechlich enorm und deutlich sichtbar!