Schrift
[thread]6058[/thread]

Threads auf mehreren Prozessoren



<< >> 9 Einträge, 1 Seite
frambo
 2004-02-04 15:07
#79804 #79804
User since
2003-09-22
16 Artikel
BenutzerIn
[default_avatar]
Hallo !

Ich arbeite auf einer Maschine, die ca. 30 Prozessoren hat und unter IRIX läuft. Nun laufen dort ein paar Perl-Programme, die ich gerne mit Threads ausstatten würde, um auch auf mehreren Prozessoren parallel zu rechnen und damit die Programme (intern) zu beschleunigen.

Gibt es diese Threadunterstützung schon in Perl bzw. sind diese auch auf mehrere CPU's auslegbar ? Gibts sonst andere Möglichkeiten, Prozesse parallel zum laufen zu kriegen ?
ptk
 2004-02-04 17:56
#79805 #79805
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ist die Thread-Implementation dort pthreads-kompatibel? Dann sollte die normale perl-Unterstuetzung dafuer laufen. Aber ich denke, dass eine fork-basierte Implementation bessere Resultate liefern koennte...
frambo
 2004-02-05 09:31
#79806 #79806
User since
2003-09-22
16 Artikel
BenutzerIn
[default_avatar]
Das waren sehr gute Hinweise. Damit kann ich mich jetzt mal in fork() einarbeiten. Ob die Perlversion auf der Maschine mit dem -pthreads Flag kompiliert wurde, kann ich leider so nicht herausfinden, da ich selbst nur der User auf der Maschine bin :(
sri
 2004-02-05 11:53
#79807 #79807
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,

Also die aktuelle thread implementierung von Perl heisst iThreads.

Selbstverständlich werden threads auf verschiedene cpus verteilt, das ist aber sache des Betriebssystems!

Ob dein Perl mit iThreads compiliert ist kannst du ganz einfach rausfinden.

Zu allererst muss es mal eine Version 5.6.1 oder grösser sein.

Wenn das zutrifft gib einfach "perl -V" ein und suche nach einem Eintrag "config_args", sollte dieser Eintrag nun "-Dusethreads" enthalten isses drin.

Empfehlen würde ich unbedingt die nutzung der neuesten Perl version (aktuell 5.8.3) da selbst die 5.8.1 noch einige schwerwiegende memory leaks enthielt.

Ich glaube mich dran zu erinnern in p5p gelesen zu haben das threads nur mit IRIX 6.3 bedenkenlos benutzbar ist.
Der Kernel von IRIX 6.2 soll angeblich einen bug enthalten der sofort nach starten des perl interpreters (mit iThreads) zur kernel panic und zum crash führt. Soll aber durch jede menge patche behebbar sein.

Das sollte reichen... :)

Cheers,
Sebastian Riedel\n\n

<!--EDIT|sri|1076072471-->
ptk
 2004-02-05 12:28
#79808 #79808
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=frambo,05.Feb..2004, 08:31]Das waren sehr gute Hinweise. Damit kann ich mich jetzt mal in fork() einarbeiten. Ob die Perlversion auf der Maschine mit dem -pthreads Flag kompiliert wurde, kann ich leider so nicht herausfinden, da ich selbst nur der User auf der Maschine bin :([/quote]
Doch, das kannst du feststellen, indem du perl -V eingibst. Dort gibt es eine Zeile, die bei dem perl hier
usethreads=undef use5005threads=undef useithreads=undef usemultiplicity=undef
lautet. Wenn mit Threads uebersetzt wurde, wirst du bei usethreads und useithreads ein "define" haben.
frambo
 2004-02-05 14:01
#79809 #79809
User since
2003-09-22
16 Artikel
BenutzerIn
[default_avatar]
Danke !

Bei meiner Maschine sind die Flags leider alle auf "undef" und bei der Ausgabe von Perl -V sehe ich schon die nicht gesetzten Kompilierflags. Da kann man dann wohl nichts machen.
Ist übrigens IRIX 6.5 drauf und ich werd mir trotzdem nochmal die iThreads anschauen.

Bis dann
Frank
ptk
 2004-02-05 17:05
#79810 #79810
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich wuerde trotzdem fork empfehlen. Die Threads in Perl sind naemlich leider gar keine "light weight processes", sondern es wird der gesamte Interpreter geklont, so dass jeder Thread recht speicherintensiv ist und somit die eigentlichen Vorteile von Threads wegfallen. Was einfacher ist, ist das Sharing von Variablen, aber auch das funktioniert nur fuer einfache Datenstrukturen, aber nicht fuer verschachtelte Strukturen oder geblesste Objekte.

Angucken sollte man sich auch forks.pm. Damit koenntest du fuer threads.pm implementieren aber ganz schnell zu einem fork-Modell umschalten und somit die beiden Arten in Performance vergleichen.
sri
 2004-02-05 18:43
#79811 #79811
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=ptk,05.02.2004, 16:05]Was einfacher ist, ist das Sharing von Variablen, aber auch das funktioniert nur fuer einfache Datenstrukturen, aber nicht fuer verschachtelte Strukturen oder geblesste Objekte.[/quote]
Das verschachtelte Datenstrukturen nicht geshared(das klingt blöd) werden können ist nicht ganz richtig.

Es muss nur jeder einzelne Datentyp vor benutzung explizit mit &share() in der Struktur freigegeben bzw. initialisiert werden.

Das mit geblessten bzw. referenzierten strukturen ist leider so. :(

forks.pm ist ein tolles Modul, es hat allerdings den Nachteil etwas grösserer Verzögerungen, da blockierende sockets zur Kommunikation benutzt werden.

Solltest du also grössere Datenmengen zwischen den threads teilen wollen benutz forks.pm, wenn du wert auf geringe latenzzeiten legst benutz threads.

Cheers,
Sebastian Riedel\n\n

<!--EDIT|sri|1076002544-->
Strat
 2004-02-05 19:54
#79812 #79812
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ithreads sind IMHO noch nicht besonders stabil (gerade im Sinne auf Memoryleaks, auch wenn in 5.8.2 wieder eine Menge behoben wurden)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 9 Einträge, 1 Seite



View all threads created 2004-02-04 15:07.