HyperThrading/Mulitprozessor ausnutzen mit Java

jpwookenny

Vice Admiral Special
Mitglied seit
11.11.2001
Beiträge
613
Renomée
0
Standort
Bikini Bottom
Hi, ich habe immo an der Uni ein Programmierprojekt in Java.
Dazu wollte ich mal folgendes wissen:

Um mehrere Prozessoren des Systems auszunutzen (auch die virtuellen des P4 HT) muss ich nur alle Berechnungen in verschiedene Threads auteilen?
Möglichst viele?
Gibt es in der Art, wie man die Programme für diese Systeme schreibt einen Unterschied zwischen echten Multiprozessor Systemen und dem P4 HT?

vielen Dank, hab auch schon gegoogelt, aber nix befriedigendes gefunden
 
Ja, du brauchst mehrere Threads.

Beim P4 musst du die Threads anders synchronisieren - also nicht durch zb. Warteschleifen, weil du dann nicht die CPU warten lässt die nichts zu tun hat, sondern eben die einzige vorhandene CPU.
 
Original geschrieben von intel_hasser
Ja, du brauchst mehrere Threads.

Beim P4 musst du die Threads anders synchronisieren - also nicht durch zb. Warteschleifen, weil du dann nicht die CPU warten lässt die nichts zu tun hat, sondern eben die einzige vorhandene CPU.

Threads werden grundsätzlich nicht mit Warteschleifen synchronisiert, zumindest nicht explizit. Dafür gibt es extra Mechanismen (Mutex, Semaphore...), welche das abhandeln. Wenn man einen Prozess/Thread warten lassen will, legt man ihn schlafen, und verfrachtet ihn nicht in eine Warteschleife. Das macht man weder mit echten, noch mit logischen Mehrprozessormaschinen so.
 
Ist ja ok - ich hab selber noch net Multithreaded geschrieben, bestand einfach nie die Notwendigkeit nach.

Die Warteschleifen waren auch eher symbolisch gemeint, eben für die verschiedenen Synchronisationstechniken. SSE3 enthält da zb. einige neue, die extra für SMT geschaffen worden (bzw. eben HT).
 
Ist wahrscheinlich eh nicht mehr aktuell, aber da ich grade Threads in der Uni habe:

Deine Klasse muss von der Klasse Thread erben (vorher das java.awt.* importen) d.h. public class blabla extends Thread.
Dann muss du eine Methode (public void run() ) implementieren die praktisch beim Aufruf des Objekts gestarter wird.
Meist wird die ja in der main Methode gestartet, erzeugst ein Objekt von deiner Klasse und startest es mit Name.start() (wichtig!!!, es muss start heissen, nicht run)

HIER gibs mehr Infos :D

Allerdings weiss ich nicht wie das mit dem P4 HT funktioniert, also obs jetzt wirklch "echte" Threads sind...
 
Ich glaube das erzeugen neuer Threads kannst du ganz einfach mit dem taskmanager kontrollieren erst VM starten und dann neue threads erzeugen, die VM sollte dann die gleiche Zahl neuer threads aufweisen. Beim beenden funktioniert das wegen dem asynchronen GC nicht. Eventuell könnte system.gc() hier helfen, genaueres wirst du aber nur von einem debugger erfahren.
 
Um mehrere Prozessoren des Systems auszunutzen (auch die virtuellen des P4 HT) muss ich nur alle Berechnungen in verschiedene Threads auteilen?
Hmmm, an sich schon ;-)
Macht der HT nicht da auch selber einen Teil von sich aus? *noahnung*

Möglichst viele?
Nein, ab einer bestimmten Anzahl ist der Overhead/Kommunikationsaufwand meist zu groß. Mach einfach so viele Threads wie die Proc. hast (oder einfach mal anhand eines Konkreten Problems testen - also die Anzahl der Threads langsam erhöhen).

Gibt es in der Art, wie man die Programme für diese Systeme schreibt einen Unterschied zwischen echten Multiprozessor Systemen und dem P4 HT?
Ja - Wenn alles auf einem Proc. geschied ist der Kommunikationsaufwand sehr klein (SMP - Shared Memory Proc.), da beide den gleichen Cache und deren Adressraum nutzen. Bei echten Multiprozessor Systemen ist es sehr viel mehr wichtig, die auszutauschenden Nachrichten gering zu halten (auch noch SMP). Am "schlimmsten" ist das ganze bei DMS (Distributed Memory Systemen), da hier die Nachrichten meist über ein sehr langsames Netzwerk (im vergleich zur Rechenzeit) geschickt werden müssen.

Java ist (meiner Meinung nach) nicht die richtige Sprache für schnelle Multiproc. Systeme. Vielleicht erkundigst du dich besser nach OpenMP, MPI bzw. einer Kombination von beidem (wenn du mit einem Cluster an der UNI arbeiten kannst).

Was für einen SMP oder Cluster hast du den? Um welche Art von Programm handelt es sich eigentlich?
 
Original geschrieben von Orkomike
Hmmm, an sich schon ;-)
Macht der HT nicht da auch selber einen Teil von sich aus? *noahnung*

Nö, das muß man schon in Software machen. Die Hardware kann das nur schedulen.


Am "schlimmsten" ist das ganze bei DMS (Distributed Memory Systemen), da hier die Nachrichten meist über ein sehr langsames Netzwerk (im vergleich zur Rechenzeit) geschickt werden müssen.

Ist da multithreading überhaupt noch möglich? Ich meine theoretisch bestimmt, aber gibt es überhaupt Hardware, mit der das machbar ist?[/B][/QUOTE]
 
Zurück
Oben Unten