• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Unterschied Thread - Prozessor

Mitglied seit
12.04.2003
Beiträge
1.806
Reaktionen
0
Tja was ist da genau der Unterschied?
Dass man Daten bzw Aufgaben auf verschiedene Prozessoren aufteilt um dadurch eine höhere Geschwindigkeit zu bekommen ist klar - allerdings macht man das auch bei Threads obwohl man doch selbst entscheiden kann wie viele Threads man haben möchte(?).

Also z.B. wenn man bei Open Mp eine for Schleife parallelisiert haben möchte und das mit 4 Threads macht, aber nur 2 Kerne hat.... wie kann ich da Rechenzeit rausschlagen?

Also in kurz: Warum kann ich mehr Threads als Prozessoren haben?
(sorry, falls das eine unglaublich dumme Frage ist, bisher konnte sie mir keiner zufriedenstellend beantworten)
 

Shihatsu

Administrator
Mitglied seit
26.09.2001
Beiträge
49.664
Reaktionen
10.267
Das und das und vor allem ganz grundsätzlich das und Folge-Links gelesen und verstanden? Ist kein so arg triviales Thema, grösster Feind ist hier jedoch weder die Informatik noch Elektrik oder gar Mathe, sondern die Sprache.
Kurz zusammengefasst: du kannst nicht mehr gleichzeitig ablaufende Prozesse als Prozessoren in einer "Landschaft" (z.B. dem Kernel) haben. Ein Prozess kann jedoch N threads haben. Parallelisierung heisst hier nicht in Echtzeit gleichzeitg ablaufend, sondern Teilung von Arbeitsmitteln. Arbeitsmittel sind auch alle zur Verfügung stehenden CPU-Register, von denen ein Kern einer CPU ne ganze Menge hat.
 
Mitglied seit
26.10.2004
Beiträge
1.517
Reaktionen
0
Jeder Prozessor kann natürlich nur einen Thread zu einem bestimmten Zeitpunkt bearbeiten.

Jetzt stell dir vor du hättest eine CPU mit einem Prozessor und dieser würde eine lange Rechenaufgabe bearbeiten. Zeitgleich bewegst du jedoch ab und an die Maus.
Wie kann das funktionieren? Die Mauszeigerbewegung muss natürlich auch irgendwie berechnet werden. Der Prozessor hört für ein paar Taktraten auf die Rechenaufgabe zu bearbeiten und bewegt den Zeiger. Anschließend widmet er sich wieder der Rechenaufgabe.
Es ist also möglich zwischendurch einfach so den Thread zu wechseln.
Threads werden dann nicht zeitgleich bearbeitet, sondern nacheinander, bzw. sie wechseln sich einfach immer wieder ab.

Nach außen betrachtet findet das ganze in so kleinen Zeitintervallen statt, dass es parallel wirkt. Im Endeffekt wird jedoch nur das Arbeitsmittel ( die CPU) geteilt (jeder darf für eine gewisse Zeit mal ran).

Wenn du eine Aufgabe nun auf zwei Threads aufteilst, dann kannst du natürlich nur mehr Rechenzeit herausschlagen, wenn du auch wirklich mehrere Prozessoren hast.

Du kannst beliebig viele Threads scheinbar "parallel" laufen lassen. Wirklich gleichzeitig bedient werden aber immer nur soviele wie du Prozessoren hast.
 
Zuletzt bearbeitet:
Mitglied seit
12.04.2003
Beiträge
1.806
Reaktionen
0
hmm hört sich logisch an. Ich frage mich nur, warum uns das bisher niemand so beigebracht hat. Wir lernen halt ein bisschen OpenMp, gerade wurde auch noch PThreads angeschnitten und MPI. Und bei ersteren kann man ja nach belieben Threads erstellen... warum? Also was für einen Sinn hat es mehr Threads zu erstellen, als ich CPUs habe?

die Artikel habe ich btw nur kurz überflogen, morgen gibts ne Klausur und da ist das Thema Unterschied Thread/Prozessor eher von untergeordneter Bedeutung, wird also erst danach richtig durchgearbeitet werden. Trotzdem thx :deliver:
 
Mitglied seit
01.06.2007
Beiträge
761
Reaktionen
0
Also was für einen Sinn hat es mehr Threads zu erstellen, als ich CPUs habe?

Das macht je nach Applikation sogar sehr viel Sinn. Vorallem dann, wenn Dein Programm die CPU mit einem Thread nicht auslastet. Klassisches Beispiel ist ein Thread für die GUI (um weiterhin Interaktion zu ermöglichen) und X Threads für Hintergrundarbeit. Hättest Du nur einen Thread für alles, so wäre Deine GUI solange geblockt bis die Hintergrundarbeit erledigt ist.

Einige weitere Beispiele:

You can consider using multithreading on a single CPU

If you use network resources
If you do high-intensive IO operations
If you pull data from a database
If you exploit other stuff with possible delays
If you want to make your app with ultraspeed reaction

When you should not use multithreading on a single CPU

High-intensive operations which do almost 100% CPU usage
If you are not sure how to use threads and synchronization
If your application cannot be divided into several parallel processes
 
Zuletzt bearbeitet:
Mitglied seit
12.04.2003
Beiträge
1.806
Reaktionen
0
Ja okay, da macht es sehr viel Sinn. Woran ich eher gedacht habe ist etwa das "parallelisieren" einer for-schleife mit Threads.
Mir würde es sinnvoll erscheinen einen Thread die for-Schleife durchlaufen zu lassen, während andere sich um den Rest kümmern der danach kommt (falls das dann in dem Kontext sinnvoll ist).
Wenn sich allerdings alle Threads um die Schleife kümmern, worin liegt dann der Vorteil vier Threads zu nutzen, wenn ich einen benutzen könnte, der viermal so schnell ist? (Die vier einzelnen Threads würden sich ja immer abwechseln, der einzelne natürlich nicht)

Also dass es Sinn ergibt für verschiedene Aufgaben einzelne Threads zu erstellen sehe ich ein - aber für dieselbe Aufgabe...?
 
Mitglied seit
01.06.2007
Beiträge
761
Reaktionen
0
Wenn sich allerdings alle Threads um die Schleife kümmern, worin liegt dann der Vorteil vier Threads zu nutzen, wenn ich einen benutzen könnte, der viermal so schnell ist? (Die vier einzelnen Threads würden sich ja immer abwechseln, der einzelne natürlich nicht)

Da ich nicht weiß, was in deiner for-Schleife passiert kann ich keine Antwort darauf geben.
Eine Parallelisierung der Arbeit in einer for-Schleife macht durchaus Sinn wenn die Arbeit jedes Schleifendurchgangs die CPU nicht auslastet und die einzelnen Schleifendurchgänge voneinander unabhängig sind (es also keine Abhängigkeiten untereinander gibt).

wenn ich einen benutzen könnte, der viermal so schnell ist? (Die vier einzelnen Threads würden sich ja immer abwechseln, der einzelne natürlich nicht)

Deine Aussage wäre korrekt, wenn die CPU mit jedem Schleifendurchgang zu jeder Zeit zu 100% ausgelastet ist. Denk einfach daran, daß sich bei der Abarbeitung der Befehle eines Schleifendurchgangs Verzögerungen ergeben können z.B. durch das Warten auf eine Resource (I/O, Network, etc.). Diese Wartezeit kann ein anderer Thread nutzen um seinerseits Arbeit zu verrichten. In diesem Fall sollte sich durch mehrere Threads die Performance durchaus erhöhen.
Generell ist es wie gesagt stark von der zu verrichtenden Arbeit abgängig, ob eine Parallelisierung auf einer singlethreaded CPU Sinn macht.
 
Zuletzt bearbeitet:

skY

Mitglied seit
03.01.2006
Beiträge
301
Reaktionen
16
wir hatten OpenMP nur relativ kurz angeschnitten, passt ja ganz gut zum thema.

wie verhaelt sich OpenMP in den folgenden situationen?

1.
schleifendurchlaeufe selbst sind voneinander unabhaengig, z.b. folgende aktionen:
daten auslesen, veraendern, wieder zurueckschreiben. immer verschiedene datensaetze die voneinander unabhaengig sind natuerlich.


2.
schleifendurchlaeufe sind nicht unabhaengig, z.b. array sortieren.



meine tipps waeren:
bei 1: die schleifendurchlaeufe werden auch parallel abgearbeitet. also ein freier prozessor schnappt sich immer einen datensatz und verbastelt den dann, auch, wenn der vorige noch nicht fertig wurde.

bei 2: naja korrekt waere natuerlich, dass immer nur ein thread gleichzeitig arbeitet, damit keine fehler enstehen. aber macht das OpenMP so?
 
Mitglied seit
12.04.2003
Beiträge
1.806
Reaktionen
0
ah okay, so langsam lichtet es sich bei mir (sorry, dass es etwas dauert ^^).

Mal zu einem bestimmten Beispiel, sagen wir mal Matrix-Vektor Multiplikation

for i = 1 : n
for j = 1 : n
y = A(i,j)*x(i)
end for
end for

Würde es in solch einem Beispiel Sinn ergeben? Also angenommen n ist ziemlich groß. Das einzige wo hier ja Wartezeiten entstehen können sind bei den Speicherzugriffen. Während T1 auf A(1,1) zugreift könnte T2 auf A(2,3) zugreifen und seinerseits Berechnungen anstellen, da der Speicherzugriff ja wesentlich länger dauert als eine arithmetrische Operation.
Wobei ich mich hier frage ob der Speicherzugriff simultan geschehen kann...

Ist das denn so richtig? Oder wäre es sinnlos die Schleife zu parallelisieren?
Sorry, dass ich so lang brauche und mich so schlecht auskenne, wir haben zwar Informatische Fächer (Softwarentwicklung, High Performance Computing..) aber die tiefgreifende Funktionsweise von so nem Computer wird kaum eingegangen.


@Sky:
Ja, ich denke Du hast recht. Zum ersten: Prozessoren müssen es anscheinend nicht sein, sondern Threads und zum zweiten: Es kommt drauf an, wie man es Programmiert. Wenn Du verschiedenen Threads unterschiedliche Teilarrays gibst und die sortieren lässt und sie danach zusammenfügst (à la mergesort) ist es sinnvoll (bzw ist es da sinnvoll? Die Threads müssen doch auf nichts warten??)
 
Zuletzt bearbeitet:
Mitglied seit
01.06.2007
Beiträge
761
Reaktionen
0
Schwierige Frage, probiers aus. Mit OpenMP hab ich keine Erfahrung, aber ich würde stark annehmen, daß die Performance in diesem Fall mit einer Single-CPU ziemlich in den Keller geht.
 
Oben