Also habe ich mit Pthreads herumgespielt, insbesondere versucht, das Produkt zweier Matrizen zu berechnen. Mein Code ist extrem chaotisch, weil er nur ein kleines, lustiges Projekt für mich selbst sein sollte, aber die Thread-Theorie, die ich verwendete, war sehr ähnlich zu:
%Vor%Quelle: Ссылка
Für die Version ohne Threading verwendete ich das gleiche Setup (3 2-d-Matrizen, dynamisch zugewiesene Strukturen für r / c) und fügte einen Timer hinzu. Erste Versuche zeigten, dass die Version ohne Gewinde schneller war. Mein erster Gedanke war, dass die Dimensionen zu klein waren, um einen Unterschied zu bemerken, und es dauerte länger, die Threads zu erstellen. Also habe ich die Dimensionen auf ungefähr 50x50 erhöht, zufällig gefüllt und ausgeführt, und ich sehe noch immer kein Leistungsupgrade mit der Threaded-Version.
Was fehlt mir hier?
Sofern Sie nicht mit sehr großen Matrizen (viele tausend Zeilen / Spalten) arbeiten, ist es unwahrscheinlich, dass Sie bei diesem Ansatz viel Verbesserung sehen. Das Einrichten eines Threads auf einer modernen CPU / OS ist in Bezug auf die CPU-Zeit ziemlich teuer, viel mehr Zeit als einige Multiplikationsoperationen.
Außerdem lohnt es sich normalerweise nicht, mehr als einen Thread pro CPU-Kern einzurichten, den Sie zur Verfügung haben. Wenn Sie beispielsweise nur zwei Kerne haben und 2500 Threads (für 50x50-Matrizen) einrichten, dann wird das Betriebssystem die ganze Zeit damit verbringen, zwischen diesen 2500 Threads zu verwalten und zwischen diesen zu wechseln, anstatt Ihre Berechnungen durchzuführen.
Wenn Sie vorher zwei Threads einrichten (immer noch eine Zweikern-CPU vorausgesetzt), behalten Sie diese Threads immer zur Verfügung und warten Sie mit den 2500-Punkt-Produkten, die Sie irgendwie berechnen müssen der synchronisierten Arbeitswarteschlange, dann > können Sie anfangen, eine Verbesserung zu sehen. Es wird jedoch immer noch nicht mehr als 50% besser sein als die Verwendung nur eines Kerns.
Ich bin nicht ganz sicher, ob ich den Quellcode verstehe, aber hier ist, wie er aussieht: Sie haben eine Schleife, die M * N-mal läuft. Jedes Mal, wenn Sie die Schleife durchlaufen, erstellen Sie einen Thread, der eine Zahl in die Ergebnismatrix einträgt. Aber nachdem Sie den Thread gestartet haben, warten Sie, bis er fertig ist. Ich glaube nicht, dass du jemals mehr als einen Thread läufst.
Auch wenn Sie mehr als einen Thread ausgeführt haben, macht der Thread eine triviale Menge an Arbeit. Selbst wenn K groß war (du nennst 50), ist 50 Multiplikationen nicht viel verglichen mit den Kosten für das Starten des Threads an erster Stelle. Das Programm sollte weniger Threads erstellen - sicherlich nicht mehr als die Anzahl der Prozessoren - und ihnen mehr Arbeit zuweisen.
Sie erlauben nicht viel parallele Ausführung: Sie warten unmittelbar nach dem Erstellen auf den Thread, so dass Ihr Programm praktisch keine zusätzlichen CPUs verwenden kann (d. h. es kann niemals eine dritte CPU / einen dritten Kern verwenden). Versuchen Sie, mehr Threads auszuführen (wahrscheinlich bis zur Anzahl der Cores, die Sie haben).
Wenn Sie einen Prozessor mit zwei Kernen haben, sollten Sie die auszuführende Arbeit in zwei Hälften teilen und jedem Thread eine Hälfte geben. Das gleiche Prinzip, wenn Sie 3, 4, 5 Kerne haben. Das optimale Leistungsdesign wird immer der Anzahl der Threads der Anzahl der verfügbaren Kerne entsprechen (mit den verfügbaren Kernen, die nicht bereits von anderen Prozessen verwendet werden).
Eine weitere Sache, die Sie beachten müssen, ist, dass jeder Thread seine Daten zusammenhängend und unabhängig von den Daten für die anderen Threads haben muss. Andernfalls werden Memcache-Fehler die Verarbeitung erheblich verlangsamen.
Um diese Probleme besser zu verstehen, empfehle ich das Buch Patterns for Parallel Programming Ссылка
Obwohl seine Codebeispiele mehr auf OpenMP & amp; MPI, und Sie verwenden PThreads, immer noch die erste Hälfte des Buches ist sehr reich an grundlegenden Konzepten & amp; Inneres Arbeiten von Multithreading-Umgebungen, sehr nützlich, um die meisten auftretenden Leistungsengpässe zu vermeiden.
Vorausgesetzt, der Code wird korrekt parallelisiert (ich werde das nicht überprüfen), steigt die Performance wahrscheinlich nur, wenn der Code in Hardware parallelisiert wird, dh Threads sind wirklich parallel (Multi-Core, Multi-CPU, ... andere Technologien ...) und nicht offensichtlich ("Multitasking" -Weg) parallel. Nur eine Idee, ich bin mir nicht sicher, dass das der Fall ist.
Tags und Links c multithreading