C++ OpenMP-Alternative

Crazy Driver

Ensign
Registriert
Jan. 2011
Beiträge
182
Hallo,
Immer wieder stört es mich, dass wenn ich ein einfaches Programm schreibe, das mir
z.B. irgendeine riesige Zahl errechnet, ich immer nur einen Thread benutze.
Ich möchte aber ALLE verwenden!
Wenn ich daraufhin im Internet nach einer Lösung suche stoße ich andauernd auf OpenMP!
Das habe ich schon ausprobiert aber irgendwie bekomme ich das nicht richtig implementiert.
Oft kommt es dann zu "Critical sections"!
Gibt es denn vielleicht eine Alternative mit der ich zum Beispiel auch ein cout beschleunigen kann?
Und warum kann man denn nicht in Visual Studio einstellen, wie viele Kerne das Programm maximal beanspruchen darf?
 
Du kannst es deshalb nicht in Visual Studio einstellen, weil C++ keine Mechanismen hat, um deine Berechnungen automatisch auf mehrere Threads zu verteilen. Ich wüsste auch nicht, ob es überhaupt so eine Programmiersprache gibt. Du musst also manuell Threads erstellen und diese sinnvoll mit Code füllen. Das mit den "Critical sections" liegt wohl daran, dass du mit einem Thread Daten liest, während du mit dem anderen Thread Daten in den selben Speicherbereich schreibst. BÖSE!! :evillol: Um das zu verhindern werden gerne Semaphoren eingesetzt um eine Variable für andere Threads zu sperren. Lies dir auch den Wiki-Artikel über Deadlocks durch bevor du weiter programmierst.


Gute Nacht!
 
ich kenne mich mit OpenMP nur bedingt aus, aber mit meinem allgemeinen Verständnis vom paralleler Programmierung, könnte eine "Critical section", ein code abschnitt sein, bei dem mehrere Threads potentiell gleichzeitig auf den gleichen Speicherbereich zugreifen.
Bei sowas ist es die Pflicht des Programmierers, sicherzustellen, dass immer nur ein Thread gleichzeitig den Speicherbereich verändert.
(Stichwort Mutex; OpenMP hat bestimmt etwas, um einen Mutex einzurichten).

Alternative zu OpenMP wäre, die Parallelisierung selbst zu übernehmen.
Möglich z. B. unter Linus mit der pThreads Library.
Ansonsten gleich OpenCL, um wirklich auch massiv parallel zu programmieren (also auch mit GPU)

Insgesamt glaube ich, dass dir ein bisschen das Verständnis für parallele Programmierung fehlt.
Einfach zu sagen: Programm, nutze 3 Kerne! bringt gar nichts, wenn das Programm nicht so geschrieben ist, dass es mit auch mit 3 Kernen was anfangen kann!
Ist ein Programm nicht parallel geschrieben, kann es auch nicht mehrere Threads nutzen.
Um sich möglichst wenig um Parallelität zu kümmern, ist afaik aber OpenMP für C++ die einfachste Möglichkeit, da man da zumindest nicht alle Threads selbst erstellen muss.

Zum Thema Parallelität, google mal:
"Race conditions"
"Deadlock"
"Erzeuger-Verbraucher-Problem"
"Semaphore"

Damit solltest du ein Verständnis dafür bekommen, welche Probleme bei paralleler Programmierung entstehen können, die es im sequentiellen nicht gibt und wie man damit umgehen kann.

Falls ich mich geirrt habe und du dich doch mit Parallelität auskennst, hilft nur, die OpenMP-Dokumentation und Tutorials zu lesen.


cout lässt sich afaik hardwarebedingt nicht beschleunigen.

@Meister_Alucar
afaik, sorgt OpenCL automatisch, dass die Berechnung auf mehrere Threads verteilt wird. Man muss halt das ganze entsprechend einrichten und den OpenCL-Kernel entsprechend schreiben, so dass er auch mehrere Threads nutzt

Gruß
New_Escaflowne

EDIT: zu spät ^^
 
Zuletzt bearbeitet:
kann dir erstmal als tip sagen, dass der aufruf von std::cout sehr teuer ist und du ihn nicht beschleunigen kannst. hier wäre es angebracht die ausgabe in eine log-datei zu schreiben oder cout nur zu besonderen anlässen aufzurufen.

falls du dich doch in die materie reinhängen willst, zieh dir die ersten paar foliensätze von hier. auf seite 56 im ersten foliensatz bekommst auch ein beispiel zur parallelen berechnung von Pi mittels OpenMP.
 
Eine Alternative zu OpenMP wäre z.B. noch die Intel Threading Building Block (TBB) http://threadingbuildingblocks.org/ ... aber um die effektiv verwenden zu können, mußt du genau so die Grundlagen der Parallelisierung verstanden haben wie bei OpenMP.
 
such mal nach lock levels, für openMP, da wird dir geholfen ;)
man kann die Daten auch buffern und den Buffer mit cout ausgeben...

gruß
 
im neuen C++11 Standard gibt es die Möglichkeit Funktionen asynchron mittels 'async' auszuführen. Näheres steht hier:

http://en.cppreference.com/w/cpp/thread/async

Leider ist imo eine 'gute' automatische Parallelisierung beliebiger 'Berechnungen' nicht möglich. Die Aufteilung in parallel verarbeitbare Einheiten bleibt beim Programmierer.
 
Man benutzt Multithreading nicht, weil es zu lange dauert, die drölfzigste Fibonacci-Zahl (oder sonst irgendeine große Zahl zu berechnen). Das geht im übrigen auch gar nicht, weil die Berechnung sequentiell voneinander abhängt.

Du musst schon ein Problem haben, das parallelisierbar ist. Danach solltest du dich mit den Grundlagen des Multithreadings beschäftigen, da du sonst sehr schnell sehr frustriert damit aufhörst, denn multithreaded Applications kann man nicht mehr so einfach debuggen, da muss man im Voraus wissen, was man tut und v.a. wie es tut.
 
Zurück
Oben