OpenMP: Schleife parallelisieren, die auf einen vector pusht



  • opppppp schrieb:

    Ich habe eine Schleife:

    vector<int> v;
    
    for (auto a = L.begin(); a != L.end(); ++a)
    {
        v.push_back(verarbeite(a));
    }
    

    Wie parallelisiere ich das mit OpenMP 3.1?

    Gar nicht!
    Abgesehen von dem korrekten Umgang mit dem Vector (reserve verwenden), ist das schlußendlich ein Stream Problem, so daß man es auf einem Nicht-NUMA-System überhaupt nicht sinnvoll parallelisieren kann. Die Geschwindigkeit hängt ausschließlich davon ab, wie schnell die Daten aus dem Speicher gelesen und wieder geschrieben werden können. Bei einem NUMA-System kann man unter ganz bestimmten Bedingungen die Sache beschleunigen, aber dazu müssen die einzelnen Speicherblöcke auf verschiedenen NUMA-Knoten liegen.



  • Da die einzelnen Aufrufe von verarbeite(a) wohl unabhängig voneinander jeweils nur auf einem Element des vectors arbeiten, kann man zumindest die parallelisieren. Einfach den vector vorher auf die richtige Größe bringen und dann kann man theoretisch sämtliche Elemente parallel bearbeiten!?
    Aus der Tatsache dass er push_back verwendet, würde ich zumindest schließen, dass es ihm sowieso nicht um die parallelisierung der Einfügeoperationen ging...



  • vielleicht solltet ihr mal den thread durchlesen, statt alles zu wiederholen... 🙄



  • dot schrieb:

    Da die einzelnen Aufrufe von verarbeite(a) wohl unabhängig voneinander jeweils nur auf einem Element des vectors arbeiten, kann man zumindest die parallelisieren.

    So schnell die Antwort geschrieben, ja natürlich hast recht. Allerdings muß dann der Aufwand hinreichend groß sein.



  • ~john schrieb:

    dot schrieb:

    Da die einzelnen Aufrufe von verarbeite(a) wohl unabhängig voneinander jeweils nur auf einem Element des vectors arbeiten, kann man zumindest die parallelisieren.

    So schnell die Antwort geschrieben, ja natürlich hast recht. Allerdings muß dann der Aufwand hinreichend groß sein.

    Korrekt, davon ging ich natürlich aus, denn ansonsten würde das ganze Vorhaben diese Schleife zu parallelisieren selbstverständlich überhaupt keinen Sinn machen...



  • Michael E. schrieb:

    Der C++98-Standard sagt was anderes:

    §8.5.5 schrieb:

    ...

    war mir nicht gelaeufig, sorry.

    Michael E. schrieb:

    rapso schrieb:

    ja, es ist schneller mit einem core 24werte zu schreiben als mit mehreren die um cachelines kaempfen, allerdings duerfte das schreiben von 24 int nicht das performance kritische sein.

    Mal ganz unabhängig von diesem Fall, denn bei 24 Werten braucht man gar nicht zu diskutieren.

    optimierte memset routinen koennen bei den meisten CPUs recht nah an die theoretische speicherbandbreite mit nur einem core kommen. hast du ausgefallene hardware z.b. einen 12core opteron 61xx NUMA speicher, wirst du vermutlich zwei cores brauchen die jeweils fuer ihren speicherbereich zustaendig sind, sonst bist du am verbindungsbus limitiert (HyperTransport).
    Bei einem i7 muestest du in etwa 80-100GB/s speicherbandbreite haben, damit du core-limitiert bist (und dann liegt es am bus zwischen L2 und L1).


Anmelden zum Antworten