Random-Funktion bei Multithread-Anwendungen sehr langsam

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Random-Funktion bei Multithread-Anwendungen sehr langsam

Beitrag von MitjaStachowiak »

Ich brauche ja keinen gemeinsamen Zufallsgenerator - meine Thread-Execute-Funktion macht den Zufall jetzt so:

Code: Alles auswählen

procedure TMyThread.Execute;
var
 seed   : int64;
 Random : Double;
const
 IM = 13996886;
 IA = 387746;
 IC = 2957368;
procedure InitRandom;
var
 CurPos : TPoint;
 d,e    : Double;
begin
 GetCursorPos(CurPos);
 if (CurPos.X <= 5) then CurPos.X := 5;
 d := IM / (CurPos.X + CurPos.Y);
 d := (d - Floor(d)) * 1000000;
 e := IM / GetTickCount;
 e := (e - Floor(e)) * 1000000;
 Seed := (2 * Seed + Trunc(d) + Trunc(e)) div 4;
end;
procedure DoRandom;
begin
 Seed := (Seed * IA + IC) mod IM;
 Random := Seed / IM;
end;
begin
 Seed := 572586;
 repeat begin
  InitRandom;
 
  // Beispiel für Zufallszahl:
  DoRandom;
  [...] := [...] * Random + [...];
 
  Suspend;
 end until (Terminated);
end;
Die Prozessorauslastung ist jetzt bei 70 - 80% (100% ist auch auf i7 möglich, aber schwer zu erreichen) und Multicore ist auch erheblich schneller als Singlecore.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Random-Funktion bei Multithread-Anwendungen sehr langsam

Beitrag von mschnell »

Alle Threads erzeugen so vermutlich dieselbe Sequenz an Zufalls-Zahlen (außer wenn GetTickCount zwischen der Initialisierung weiterzählen sollte).

Das ist ziemlich wenig zufällig.

Warum verwendest Du nicht einfach das "Random" von Lazarus (das ist ja hoffentlich Thread-fest) in der Initialisierung ?

-Michael

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Random-Funktion bei Multithread-Anwendungen sehr langsam

Beitrag von MitjaStachowiak »

...Weil dann alle CPUs bei 100% hängen und die Geschwindigkeit sogar zurückgeht. Deswegen habe ich ja nach einer Alternative gesucht.
Aber stimmt: Zumindest nach dem Programmstart müssten so alle Threads die gleiche Sequenz erzeugen. Aber das bekomme ich auch noch in den Griff. Bei InitRandom kann ich ja auch auf das Lazarus-Random zurückgreifen.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Random-Funktion bei Multithread-Anwendungen sehr langsam

Beitrag von mschnell »

MitjaStachowiak hat geschrieben:...Weil dann alle CPUs bei 100% hängen und die Geschwindigkeit sogar zurückgeht. Deswegen habe ich ja nach einer Alternative gesucht.
Das ist in der Initialisierungsphase (< 1 Sekunde) doch wohl egal.
MitjaStachowiak hat geschrieben:Aber stimmt: Zumindest nach dem Programmstart müssten so alle Threads die gleiche Sequenz erzeugen. Aber das bekomme ich auch noch in den Griff. Bei InitRandom kann ich ja auch auf das Lazarus-Random zurückgreifen.
Wenn sie gleich anfangen laufen sie auch gleich weiter. Oder ?

-Michael

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Random-Funktion bei Multithread-Anwendungen sehr langsam

Beitrag von MitjaStachowiak »

Nunja - InitRandom wird nicht nur beim Start des Threads, sondern für jeden neuen Auftrag, den ein solcher anfängt, aufgerufen und da nicht alle Threads gleich schnell sind, dürfte sich so mit der Zeit eine Verschiebung herausbilden...
Aber jetzt habe ich in InitRandom ja das Lazarus-Random mit eingebaut.

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Random-Funktion bei Multithread-Anwendungen sehr langsam

Beitrag von Targion »

mschnell hat geschrieben:Warum verwendest Du nicht einfach das "Random" von Lazarus (das ist ja hoffentlich Thread-fest) in der Initialisierung ?
Soweit ich weiß, ist es das nicht bzw. war es das nicht, als ich es zuletzt angeschaut habe...

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Random-Funktion bei Multithread-Anwendungen sehr langsam

Beitrag von mschnell »

MitjaStachowiak hat geschrieben:Nunja - InitRandom wird nicht nur beim Start des Threads, sondern für jeden neuen Auftrag, den ein solcher anfängt, aufgerufen
Ganz schechtes Design. Das geht bestimmt auch anders. Auch sollten Threads nicht ständig neu kreiert werden. Das ist sehr Langsam. Eine Art Thread-Pool würde helfen.

-Michael

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Random-Funktion bei Multithread-Anwendungen sehr langsam

Beitrag von mschnell »

Targion hat geschrieben:
mschnell hat geschrieben:Warum verwendest Du nicht einfach das "Random" von Lazarus (das ist ja hoffentlich Thread-fest) in der Initialisierung ?
Soweit ich weiß, ist es das nicht bzw. war es das nicht, als ich es zuletzt angeschaut habe...
Das ist natürlich schlecht. Einfache Abhilfe (natürlich nur in der Initialisiertngs-Phase): CriticalSection.
-Michael.

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Random-Funktion bei Multithread-Anwendungen sehr langsam

Beitrag von MitjaStachowiak »

_____________________________

Hm, der letzte Post in diesem Thema ist schon etwas her... Aber meine momentane Frage lässt sich hier ganz gut anhängen:

Meint Ihr, dass es sicher ist, so einen Zufalls-Algorithmus als Schlüssel zu verwenden?, also ob man, wenn man 100 Werte der Zufalls-Folge kennt, den nächsten ausrechnen kann (Ohne IM, IA oder IC vorher zu kennen)?
Wegen dem mod-Befehl sieht das für mich nach einem ziemlichen Ratespiel aus, aber näher hab' ich mich nicht damit beschäftigt...
Falls das nicht sicher ist - kennt jemand einen anderen Algorithmus dieser Art, den man als Schlüssel verwenden könnte?

(Weil ich mit FastCGI nicht weiter gekommen bin, werde ich mein Daten-Upload, an dem ich arbeite, wohl mit HTTP-Request verwirklichen. Die Daten müssen dafür nicht verschlüsselt sein, aber es muss sichergestellt werden, dass nicht jeder X-Beliebige Daten hochladen kann. Deswegen dachte ich, ich mache nur einmal ein Request mit HTTPS, um IM, IA und IC zu übergeben, und wickle den Rest aus Performance-Gründen mit HTTP und einem fortlaufenden Zufallswert als Schlüssel ab.)

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Random-Funktion bei Multithread-Anwendungen sehr langsam

Beitrag von u-boot »

MitjaStachowiak hat geschrieben: Meint Ihr, dass es sicher ist, so einen Zufalls-Algorithmus als Schlüssel zu verwenden?
, also ob man, wenn man 100 Werte der Zufalls-Folge kennt, den nächsten ausrechnen kann (Ohne IM, IA oder IC vorher zu kennen)?
Wegen dem mod-Befehl sieht das für mich nach einem ziemlichen Ratespiel aus, aber näher hab' ich mich nicht damit beschäftigt...
Der Mersenne-Twister ist kein sicherer Verschlüsselungsalgorithmus meinen zumindest Makoto Matsumoto und Takuji Nishimura. (Quelle: Makoto Matsumoto und Takuji Nishimura: "Mersenne Twister: A 623-Dimensionally Equidistributed Uniform Pseudo-Random Number Generator"; ACM Transactions on Modeling and Computer Simulation, Vol. 8 No. 1, January 1998, Pages 3-30). Ich glaub der Artikel ist ganz lesenswert, wenn man sich näher mit dem MT beschäftigen will.;)
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Random-Funktion bei Multithread-Anwendungen sehr langsam

Beitrag von MitjaStachowiak »

Danke, das werd' ich mir mal durchlesen :-)

Antworten