2009-03-05 11 views
41

Ich werde meine eigene Grafik-Engine nachrüsten, so dass Multicore-CPUs genutzt werden können. Genauer gesagt suche ich nach einer Bibliothek zum Parallelisieren von Loops.C++ Parallelisierungsbibliotheken: OpenMP vs. Thread Building Blocks

Es scheint mir, dass sowohl OpenMP als auch die Thread-Bausteine ​​von Intel sehr gut für diese Aufgabe geeignet sind. Beide werden außerdem vom C++ - Compiler von Visual Studio und den meisten anderen gängigen Compilern unterstützt. Und beide Bibliotheken scheinen ziemlich einfach zu benutzen.

Also, welche sollte ich wählen? Hat jemand beide Bibliotheken ausprobiert und kann mir einige Nachteile und Vorteile der Verwendung beider Bibliotheken geben? Was hast du am Ende gewählt?

Danke,

Adrian

+0

Ähnliche Fragen: http://stackoverflow.com/questions/326487/multithreaded-image-processing-in-c (Ich habe einen Verweis auf diese Frage in meiner Frage hinzugefügt.) – strager

Antwort

43

Ich habe TBB nicht ausgiebig verwendet, aber mein Eindruck ist, dass sie sich gegenseitig mehr als Konkurrenz ergänzen. TBB bietet threadsafe-Container und einige parallele Algorithmen, während OpenMP eher eine Möglichkeit darstellt, vorhandenen Code zu parallelisieren.

Ich persönlich gefunden OpenMP sehr einfach in bestehenden Code, wo Sie eine parallelisierbare Schleife oder eine Gruppe von Abschnitten, die parallel ausgeführt werden können, ablegen können. Es hilft Ihnen jedoch nicht besonders für den Fall, dass Sie einige gemeinsam genutzte Daten ändern müssen - wo die Container von TBB genau das sind, was Sie wollen.

Wenn Sie nur Loops parallelisieren möchten, bei denen die Iterationen unabhängig voneinander sind (oder ziemlich einfach gemacht werden können), würde ich mich für OpenMP entscheiden. Wenn Sie mehr Interaktion zwischen den Threads benötigen, denke ich, dass TBB in dieser Hinsicht ein wenig mehr bieten kann.

+2

Guter Punkt über den bestehenden Code. Es ist einfacher, hier und da ein paar Pragma zu stopfen. Das Einstecken von TBB kann schwieriger sein (hängt stark vom vorhandenen Code-Stil ab) – Anonymous

25

Von Software-Blog Intel: Compare Windows* threads, OpenMP*, Intel® Threading Building Blocks for parallel programming

Es ist auch die Frage des Stils - für mich TBB sehr C++ ist wie, während ich das nicht OpenMP Pragmas gefallen viel (stinkt nach C ein bisschen, würde es benutzen, wenn ich in C schreiben müsste).

Ich würde auch das vorhandene Wissen und die Erfahrung des Teams berücksichtigen. Das Erlernen einer neuen Bibliothek (besonders wenn es Threading/Concurrency betrifft) braucht etwas Zeit. Ich denke, dass OpenMP vorläufig bekannter ist als TBB (aber das ist nur meine Meinung).

Noch ein Faktor - aber unter Berücksichtigung der meisten gängigen Plattformen, wahrscheinlich kein Problem - Portabilität. Aber die Lizenz könnte ein Problem sein.

  • TBB enthält einige schöne Forschung aus der akademischen Forschung, zum Beispiel recursive data parallel approach.
  • Es gibt einige Arbeit an Cache-Freundlichkeit, für example.
  • Vortrag des Intel-Blogs scheint sehr interessant.
  • +0

    Danke für den Link, aber seit es ist auf der Website von Intel gehostet würde, würde ich nicht wirklich darauf vertrauen, eine völlig unvoreingenommene Meinung zu liefern. Offensichtlich schrieben sie den Artikel, um die Nutzung ihrer eigenen Bibliothek zu fördern. –

    +2

    Ja, habe das Emoticon irgendwo in der ersten Zeile vergessen;) – Anonymous

    15

    Im Allgemeinen habe ich festgestellt, dass die Verwendung von TBB viel zeitaufwendiger Änderungen an der Code-Basis mit einer hohen Auszahlung erfordert, während OpenMP eine schnelle, aber moderate Auszahlung gibt. Wenn Sie ein neues Modul von Grund auf neu starten und langfristig an TBB denken. Wenn Sie kleine aber unmittelbare Vorteile haben wollen, gehen Sie mit OpenMP.

    Auch TBB und OpenMP schließen sich nicht gegenseitig aus.

    5

    Ich habe tatsächlich beide verwendet, und mein allgemeiner Eindruck ist, dass, wenn Ihr Algorithmus ziemlich einfach ist parallel zu machen (z. B. Schleifen von einheitlicher Größe, nicht zu viel Daten Interdependenz) OpenMP ist einfacher und ziemlich nett zu arbeiten. In der Tat, wenn Sie finden, dass Sie OpenMP verwenden können, ist es wahrscheinlich der bessere Weg zu gehen, wenn Sie wissen, dass Ihre Plattform es unterstützt. Ich habe nicht die neuen Task-Strukturen von OpenMP verwendet, die viel allgemeiner sind als die ursprünglichen Loop- und Sektionsoptionen.

    TBB bietet Ihnen mehr Datenstrukturen im Voraus, erfordert aber definitiv mehr vorne. Als ein Plus, es könnte besser auf Sie race Condition Bugs bewusst machen. Was ich damit meine ist, dass es in OpenMP ziemlich einfach ist, Race Conditions zu aktivieren, indem man etwas nicht teilt (oder was auch immer). Sie sehen das nur, wenn Sie schlechte Ergebnisse bekommen. Ich denke, dass dies mit TBB etwas weniger wahrscheinlich ist.

    Insgesamt war meine persönliche Vorliebe für OpenMP, vor allem angesichts seiner erhöhten Ausdruckskraft mit Aufgaben.

    1

    In Visual Studio 2008 können Sie die folgende Zeile hinzufügen, um eine beliebige "for" -Schleife zu parallelisieren. Es funktioniert sogar mit mehreren verschachtelten for-Schleifen. Hier ein Beispiel:

    #pragma omp parallel for private(i,j) 
    for (i=0; i<num_particles; i++) 
    { 
        p[i].fitness = fitnessFunction(p[i].present); 
        if (p[i].fitness > p[i].pbestFitness) 
        { 
        p[i].pbestFitness = p[i].fitness; 
        for (j=0; j<p[i].numVars; j++) p[i].pbest[j] = p[i].present[j]; 
        } 
    } 
    gbest = pso_get_best(num_particles, p); 
    

    Nachdem wir die #pragma omp parallel, beide Kerne auf meinem Core 2 Duo bis zu ihrer maximalen Kapazität verwendet wurde hinzugefügt, so insgesamt die CPU-Auslastung ging von 50% bis 100%.

    +1

    Nur ein Hinweis: Nested-Loops funktionieren nur, wenn der Compiler dies unterstützt – Nav

    +2

    Nur noch ein Hinweis: Sie können mit 'omp parallel for' alle parallelisierbaren * parallelisieren * für die Schleife. Zum Beispiel könnten Sie 'omp parallel for' nicht verwenden, wenn der Body einen Code wie diesen enthält:' p [j] = p [j] - p [j-1] ' – chus

    1

    Soweit ich weiß, adressiert TBB (es gibt eine OpenSource Version unter GPLv2) mehr den C++ und C Bereich. In diesen Zeiten ist es schwierig C++ und allgemeine OOP-Parallelisierungs-spezifische Informationen zu finden. Die meisten adressieren funktionale Dinge wie c (das gleiche gilt für CUDA oder OpenCL). Wenn Sie C++ Unterstützung für die Parallelisierung benötigen, gehen Sie für TBB!

    +0

    TBB verwendet jetzt Apache-Lizenz ... – Jeff

    2

    Ja, TBB ist viel mehr C++ -freundlich, während OpenMP aufgrund seines Designs besser für C-Code im Fortran-Stil geeignet ist. Die neue Task-Funktion in OpenMP sieht sehr interessant aus, während gleichzeitig das Lambda- und das Funktionsobjekt in C++ 0x die Verwendung von TBB erleichtern.