Autor Beitrag
g1o2k4
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Sa 17.02.07 16:56 
hallo

ich habe ein programm in dem drei threads gestartet werden und arbeiten sollen.
der aufruf sieht so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Procedure TForm1.ButtonClick(Sender: TObject);  //hauptprogramm
begin
    SetThreadAffinityMaskByID(GetCurrentThreadId, 1); //Hauptprogramm CPU
  MyThread1 := TDecrypt.Create(a, b , x, w);
    SetThreadAffinityMaskByID(MyThread1.ThreadID, 2); //Thread1 CPU
  MyThread2 := TDecrypt.Create(c, d, x, w);
    SetThreadAffinityMaskByID(MyThread12.ThreadID, 3); //Thread2 CPU
  MyThread3 := TDecrypt.Create(e, f, x, w);
    SetThreadAffinityMaskByID(MyThread3.ThreadID, 4); // Thread3 CPU
end;


die functionen hab ich von delphipraxis.net (www.delphipraxis.net...ght=thread+prozessor), ich bin mir nicht sicher ob sie hier richtig sind, aber eigentlich sollten diese anweisungen den hauptprozess auf cpu0 und die drei threads auf cpu 1-3 verteilen, was aber nicht geschieht

alle drei threads tun das selbe nur in unterschiedlichen bereichen (a-b; c-d; e-f). in den threads sieht das so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TThread.Execute;
begin
    Synchronize(rechne);
end;

procedure TThread.rechne;
begin
  rechne;
  schreibe ergebnis nach Form1.Memo.Add.Lines('Ergebnis');
end;


wodurch ja die function gestartet wird wenn ich mich nicht irre !?

das problem ist aber, dass in delphi angezeigt wird, dass alle 3 threads gestartet wurden, aber alle erst nacheinander arbeiten. also erst arbeitet thread1, wenn er fertig ist wird er beendet und thread2 fängt an zu arbeiten und wird dann ebenfalls beendet worauf thread 3 anfängt und bei abgeschlossener arbeit beendet wird!
liegt es vielleicht am synchronize ?

1. frage wie schaffe ich es den 3 threads je einen anderen prozessorkern zuzuordnen ?
2. wie schaffe ich es alle 3 threads gleichzeitig arbeiten zu lassen, so dass jeder der 3 thread-prozessorkerne 100% auslastung hat ?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 17.02.07 17:52 
4 Dinge:
1. SetThreadAffinityMask möchte ein Bitset als 2. Parameter. Der Wert 3 heißt also auf CPU 0 und 1 gleichzeitig.
2. Wenn Du SetThreadAffinityMask eine CPU in der Maske übergibst, die nicht in der Prozess-AffinityMask enthalten ist, wird diese ignoriert
3. Übergibst Du in deinem Thread-Konstruktor die korrekten Werte für Den Suspended-Start?
4. Es gibt keine vollständig-gleichzeitige Ausführung, außer man hat ein echtes Dual-Core-System, wobei selbst in diesem Fall nur soviele Threads\Prozesse, wie es CPUs gibt, gleichzeitig laufen können.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
g1o2k4 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Sa 17.02.07 18:01 
user profile iconBenBE hat folgendes geschrieben:
4 Dinge:
3. Übergibst Du in deinem Thread-Konstruktor die korrekten Werte für Den Suspended-Start?

was meinst du damit ?

zu 4. ja ich hab nen dual xeon mit ht also 2 echte und 2 virtuelle kerne.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 17.02.07 18:11 
user profile icong1o2k4 hat folgendes geschrieben:
user profile iconBenBE hat folgendes geschrieben:
4 Dinge:
3. Übergibst Du in deinem Thread-Konstruktor die korrekten Werte für Den Suspended-Start?

was meinst du damit ?

Siehe in der Delphi-Hilfe zum Constructor der Klasse TThread (TThread.Create). Dort kann man einen Parameter übergeben, ob der Thread sofort starten soll. Dort einfach mal schauen, ob Du in deinem Konstruktor überhaupt inherited aufrufst UND da den korrekten Wert übergibst.

user profile icong1o2k4 hat folgendes geschrieben:
zu 4. ja ich hab nen dual xeon mit ht also 2 echte und 2 virtuelle kerne.

Gut, dann laufen maximal 2 Threads gleichzeitig und die anderen beiden tun nur was, wenn die CPU grad freie Kapazitäten hat. HT heißt nur, dass die CPU 2 Befehlsfolgen abarbeitet und immer aus der Befehlsfolge die Befehle hernimmt, wo sie grad nicht warten musss. Wenn also eine Befehlsfolge keine Waitstates produziert, macht die andere Befehlsfolge nix als Schlafen :P

Ach ja:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TThread.Execute;
begin
    Synchronize(rechne); //*
end;

procedure TThread.rechne;
begin
  {Self.}rechne; //**
  schreibe ergebnis nach Form1.Memo.Add.Lines('Ergebnis');
end;


* @Line 3: Synchronize als einziger Aufruf in einer Execute-Methode eines Threads ist wie wenn Du auf einer Mehrspurigen Autobahn nur jeweils einen Trabbi zulässt ...

** @Line 8: Ich hoffe, diese Zeile ist nur Pseudo-Code ;-) und steht nicht so im Quelltext :P

In einem Thread brauchst Du nur Zugriffe auf die VCL oder gemeinsame Resourcen zu synchronisieren ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
g1o2k4 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Sa 17.02.07 18:35 
ok soweit verstanden.

welchen wert muss ich denn jetzt für die cpu verteilung wählen ? ich möchte die beiden echten kerne auf thread 1 und 2 und die virtuellen 3 und 4 auch thread 3.
cpu 0 ist kern 1
cpu 1 ist kern 2
cpu 2 ist kern 1+2
cpu 3 ist was ?


der thread rechne greift in if abfragen auf gesetzte werte des hauptprozesses, z.b. welcher radiobutton an ist und so, blockt das auch ? oder nur wenns in synchronyze geupdatet wird ?
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Sa 17.02.07 18:50 
Ich würde eher mal sagen, dass solange du die gesamte Aktion mit synchronize in den MainThread tragen lassen wirst, wirst du nie echte Parallelität erlangen, auch nicht in Multi- Core Systemen

Gruß
alias5000

PS.: ich weiß, BenBE hats auch schon gesagt, ich wills nur nochmal klarer sagen ;)

_________________
Programmers never die, they just GOSUB without RETURN
g1o2k4 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Sa 17.02.07 19:14 
user profile iconalias5000 hat folgendes geschrieben:
Ich würde eher mal sagen, dass solange du die gesamte Aktion mit synchronize in den MainThread tragen lassen wirst, wirst du nie echte Parallelität erlangen, auch nicht in Multi- Core Systemen

Gruß
alias5000

PS.: ich weiß, BenBE hats auch schon gesagt, ich wills nur nochmal klarer sagen ;)



naja geht, die cpu auslastung sieht gut aus:

hier nen screenshot: www.tictech.de/BLL/MT.JPG
die auslastung von 3 cpus ist sehr konstand und die progressbar erhöht sich auch ca doppelso schnell wie sonst.

synchronize(); scheint echt zu warten bis der thread fertig ist, aber die function rechnung; greift quasi in echtzeit auf die hauptprozess vlc komponenten zu, das klappt eigentlich gut wie man sieht. die progressbar wird z.b. in echtzeit erhöht.
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Sa 17.02.07 19:25 
user profile iconBenBE hat folgendes geschrieben:
SetThreadAffinityMask möchte ein Bitset als 2. Parameter. Der Wert 3 heißt also auf CPU 0 und 1 gleichzeitig.
Damit mein BenBE (hoffentlich), das jedes Bit für eine CPU steht:
ausblenden Quelltext
1:
2:
3:
4:
0000 0001 = 1 = CPU1
0000 0010 = 2 = CPU2
0000 0011 = 3 = CPU 1+3
{usw...}
Gruß Hape!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 17.02.07 19:29 
@wulfskin: Korrekt :P

Deine Affinity-Masken müssten 1, 2, 4 und 8 sein für die einzelnen Threads ... wie die CPUs der Reihe nach angeordnet sind, weiß ich für Xeons nicht ... Musst Du probieren ...

Wie gesagt: In Threads auf die VCL zugreifen ist ein Verbrechen ... Synchronisiere nur die Befehle (einzelne, zusammengehörige Zeilen, die auf die VCL zugreifen.

Deine Berechnung solltest Du soweit es geht ohne VCL-Interaktion ausführen.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
g1o2k4 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Sa 17.02.07 20:22 
ok. dann wäre ja alles geklärt ^^