Frage

Ich werde retrofit-meine benutzerdefinierte Grafik-engine, so dass es nutzt die Vorteile von multicore-CPUs.Mehr genau, ich bin auf der Suche nach einer Bibliothek zu parallelisieren von Schleifen.

Es scheint mir, dass beide OpenMP Intel Thread Building Blocks sind sehr gut geeignet für den job.Außerdem unterstützt Visual Studio C++ - compiler und die meisten anderen gängigen Compilern.Und beide Bibliotheken scheinen ziemlich gerade-vorwärts, um zu verwenden.

Also, welche soll ich wählen?Hat jemand versucht, sowohl die Bibliotheken und kann mir einige Nachteile und Vorteile der Verwendung der Bibliothek?Auch, was Sie Tat, wählen, mit zu arbeiten am Ende?

Vielen Dank,

Adrian

War es hilfreich?

Lösung

Ich habe nicht verwendet TBB umfangreich, aber mein Eindruck ist, dass Sie sich gegenseitig ergänzen mehr, als die Konkurrenz.TBB bietet threadsicher Container und einige parallele algorithmen, in der Erwägung, dass die OpenMP ist mehr ein Weg, um parallelise vorhandenen code.

Ich persönlich habe festgestellt OpenMP sehr leicht zu fallen in bestehenden code, wenn Sie haben eine parallelisable Schleife oder eine Reihe von Abschnitten, die parallel ausgeführt werden können.Aber es hilft Ihnen nicht besonders für einen Fall, wo Sie brauchen, um zu ändern Sie einige gemeinsame Daten - wo TBB gleichzeitige Container könnte genau das sein, was Sie wollen.

Wenn alle Sie wollen, ist parallelise Schleifen, wo Sie die Iterationen unabhängig sind (oder können sein ziemlich leicht gemacht so), würde ich gehen für OpenMP.Wenn Sie sind gehen zu müssen, mehr Interaktion zwischen den threads, ich denke, TBB bieten vielleicht ein wenig mehr in dieser Hinsicht.

Andere Tipps

Von Intels software blog: Vergleichen Sie in Windows* - threads, OpenMP*, Intel® Threading Building Blocks for parallel programming

Es ist auch die Frage des Stils - für mich TBB ist sehr C++ - like, während ich nicht wie OpenMP-pragmas, dass viel (riecht nach C ein bisschen, würde es verwenden, wenn ich in C schreiben).

Ich würde auch überlegen, das vorhandene wissen und die Erfahrung des Teams.Lernen Sie eine neue Bibliothek (vor allem, wenn es um die threading - /Gleichzeitigkeit) hat einige Zeit in Anspruch nehmen.Ich denke, dass für jetzt -, OpenMP-mehr weithin bekannt und eingesetzt als TBB (dies ist aber nur in der Meinung).

Noch ein weiterer Faktor - aber wenn man bedenkt die meisten gemeinsame Plattformen, wahrscheinlich nicht ein Problem - Portabilität.Aber die Lizenz könnte ein Problem sein.

  • TBB enthält einige nette Forschung mit Ursprung in der wissenschaftlichen Forschung, zum Beispiel recursive data parallel approach.
  • Es gibt einige arbeiten, die auf cache-Freundlichkeit, für Beispiel.
  • Vortrag der Intel-blog scheint wirklich interessant.

Im Allgemeinen habe ich festgestellt, dass mit TBB erfordert viel mehr Zeit in Anspruch änderungen an der code-Basis mit einer hohen Belohnung während OpenMP ermöglicht einen schnellen, aber moderaten Belohnung.Falls Sie starrte ein neues Modul von Grund auf und denken langfristig gehen mit TBB.Wenn Sie möchten, dass kleine, aber sofortige Gewinne gehen mit OpenMP.

Auch, TBB und OpenMP sind nicht gegenseitig exklusive.

Ich habe tatsächlich verwendet beide, und mein allgemeiner Eindruck ist, dass, wenn Ihr Algorithmus ist ziemlich einfach zu machen, parallel (z.B.loops von selbst Größe, nicht zu viel Daten Interdependenz) OpenMP ist einfacher, und ziemlich nett, mit zu arbeiten.In der Tat, wenn Sie finden, dass Sie verwenden können, OpenMP, ist es wahrscheinlich der bessere Weg zu gehen, wenn Sie wissen, dass Ihre Plattform zu unterstützen.Ich habe nicht verwendet OpenMP neue Aufgabe, Strukturen, die viel allgemeiner als die ursprüngliche Schleife und Abschnitt Optionen.

TBB gibt Sie mehr Daten-Strukturen vorne, sondern erfordert auf jeden Fall mehr nach vorne.Als ein plus, es könnte besser machen Sie sich bewusst von race-Bedingung bugs.Was ich durch dieses bedeute, ist, dass es ziemlich einfach in OpenMP zu aktivieren race-Bedingungen nicht etwas gemeinsames (oder was auch immer) sein sollte.Sie sehen dies nur, wenn man schlechte Ergebnisse.Ich denke, das ist ein bisschen weniger wahrscheinlich auftreten, mit TBB.

Insgesamt meine persönliche Präferenz war für OpenMP, vor allem angesichts der erhöhten Ausdruckskraft mit Aufgaben.

Viva64 links: Parallele Programmierung.

Ja, TBB ist viel mehr C++ freundlich, während OpenMP ist mehr geeignet für FORTRAN-style-C-code gegeben sein design.Der neue task-Funktion in OpenMP sieht sehr interessant, während gleichzeitig die Lambda-Funktion und Objekt in C++0x machen kann TBB einfacher zu bedienen.

In Visual Studio 2008 können Sie fügen Sie die folgende Zeile zu parallelisieren keine "for" - Schleife.Es funktioniert sogar mit mehreren verschachtelten for-Schleifen.Hier ist 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 Hinzugefügt die #pragma omp parallel beide Kerne auf meinem Core 2 Duo wurden verwendet, um Ihre maximale Kapazität, also insgesamt CPU-Auslastung ging von 50% bis 100%.

Soweit ich weiß, TBB (es ist ein OpenSource-Version unter GPLv2 verfügbar) für mehr C++, dann C-Bereich.Diese Zeit ist es schwer zu finden, C++ und die Allgemeinen OOP-Parallelisierung bestimmte Informationen.Die meisten Adressen funktionale Sachen wie c (das gleiche auf der CUDA oder OpenCL).Wenn Sie benötigen C++ - Unterstützung für die Parallelisierung gehen für TBB!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top