Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programmcode skaliert nicht in MT (https://www.delphipraxis.net/211049-programmcode-skaliert-nicht-mt.html)

Gruber_Hans_12345 20. Jul 2022 15:33

Programmcode skaliert nicht in MT
 
Hallo ich bräuchte einen Suchansatz, wie ich finde, warum mein Programmcode (der sehr sehr riesig ist) nicht vernünftig skaliert wenn ich den in mehreren Threads starte.

1 Thread CPU 26% (bei 4 Kernen)
2 Threads CPU 39%
3 Threads CPU 45%
4 Threads CPU 49%
10 Threads CPU 57%

In meinem Code sind keine Synchronize drinnen (nur das OnTerminate wird verwendet um dann den Zähler runterzuzählen um zu wissen ab alle Threads fertig sind)

Es wird massiv mit variants gearbeitet, und mit strings, vermute eine große Speicher GetMem/FreeMem sache (MM ist der Fast MM4 v4.991)

Ich verwende da drinnen keine Critical Section, und für Fremdkomponenten / Code üwsste ich nicht wie ich das rausfinden kann (Breakpoint auf einen EnterCritical Section kann ich ja nicht machen oder?)

Was könnte da noch der Grund sein?

Redeemer 20. Jul 2022 15:38

AW: Programmcode skaliert nicht in MT
 
Ich hatte große Probleme mit Speicheranforderungen (SetLength) bei MT. Habe mir dann für die in meinem Code verwendeten Arrays einen eigenen Typ und eigene Methoden (GetLength, SetLength, Low, High) geschrieben, bei denen die Arrays niemals verkleinert wurden und die Länge stattdessen im ersten Eintrag stand.

Bernhard Geyer 20. Jul 2022 16:25

AW: Programmcode skaliert nicht in MT
 
Wirklich D2007?

himitsu 20. Jul 2022 17:07

AW: Programmcode skaliert nicht in MT
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1508980)
Wirklich D2007?

Jupp, in Delphi 11 oder war's schon 10.4 wurde (wenn ich das richtig mitbekommen hatte) am FastMM nochmal bissl was optimiert, bezüglich MultiThread.

Oder war's im FastMM5 und garnicht der halbe FastMM im Delphi? :gruebel:



Irgendwer hatte, die letzten paar Wochen, hier im Forum mal was dazu gesagt.





Ich weiß garnicht mehr seit wann eine Variante des FastMM4 im Delphi bereits integriert ist. (der DelphiMM durch FastMM ersetzt wurde)

Wenn es FastMM5 war und Der auch in so einem alten Delphi noch läuft, dann wäre es einen Versuch wert.

Bernhard Geyer 20. Jul 2022 17:58

AW: Programmcode skaliert nicht in MT
 
Und ich glaube es gab auch mal eine guter Verglich zwischen "Standard-Memory-Manager" + FastMM + 1-2 andere Memory-Manager.
Und AFAIK war FastMM(4) dort bei Multi-Threading nicht die #1
Aber alle haben die den ollen MemoryManager von Delphi-Versionen wie D2007 um Welten geschlagen.

Gruber_Hans_12345 20. Jul 2022 18:06

AW: Programmcode skaliert nicht in MT
 
Ja ist noch D2007 mit dem neusten FastMM 4 mittlerweile.

aber ich habe schon was gefunden was es vermutlich ist/sein kann.

ich verwende sehr viele variants, und davon auch sehr viele Customvariants

und bei jedem VarCopyDeep und VarClearDeep wird da dann FindCustomVariantType aufgerufen wo ein
Delphi-Quellcode:
EnterCriticalSection(LVarTypeSync);
und ich vermute das wird wirklich extremst oft aufgerufen, werde mal versuche diese aufrufe irgendwie zu umgehen.

Ideal wäre es wenn ich die funktionen in der variants.pas ändern kann, aber vermute da wird sich nix mehr kompilieren lassen wenn ich da den source ändere?

Gruber_Hans_12345 20. Jul 2022 21:14

AW: Programmcode skaliert nicht in MT
 
so habe die variant kopier sachen mal so umgebaut (in var value : variant statt übergabe per result usw)
aufjeden fall kommt er jetzt nicht mehr in den CirticalSection von den variants.pas rein.

Allerdings komme ich immer noch nur auf 50% bei 5 threads.

Werde dann morgen einen anderne MM ausprobieren - allerdings dachte ich mir das der halt nur langsamer ist, und nicht blockiert - also 100% CPU und braucht dann halt länger, und nicht nur 50% CPU

Gruber_Hans_12345 21. Jul 2022 08:06

AW: Programmcode skaliert nicht in MT
 
Ok liegt auf jeden Fall mal eindeutig am MM.

Hab hier mal meine Vergleichswerte
Code:
Delphi MM
1 :  9125 ms = 9125 ms
4 : 31484 ms = 7871 ms
10: 69656 ms = 6965 ms

Fast MM4
1 : 10562 ms = 10562 ms
4 : 26157 ms = 6539 ms
10: 57359 ms = 5735 ms

SynScaleMM
1 :  9172 ms = 9172 ms
4 : 10093 ms = 2523 ms
10: 24297 ms = 2429 msa
Anzahl der gleichzeitigen Threads : Dauer bis alle Threads fertig waren => Durschnittszeit wie lange ein Thread gebraucht hat.

Habe dazu den SynScaleMM verwendet, der FastMM5 lässt sich nicht kompilieren unter D2007, und da ist zuviel was man ändern müsste.

HAb nun auch den Fast MM4-AVX getestet der ist zwawr etwas schneller wie der normale FastMM4 kommt aber auch nicht an den SynScaleMM ran.

Kennt den SynScaleMM wer und hat den in verwendung?

mytbo 21. Jul 2022 11:11

AW: Programmcode skaliert nicht in MT
 
Zitat:

Zitat von Gruber_Hans_12345 (Beitrag 1509003)
Kennt den SynScaleMM wer und hat den in verwendung?

Zum Thema suchst du am besten direkt im Forum. In Bezug auf mORMot findest du diesen Kommentar in der aktuellen Version.

Bis bald...
Thomas

Gruber_Hans_12345 21. Jul 2022 16:50

AW: Programmcode skaliert nicht in MT
 
ich verwende im moment den hier https://github.com/synopse/mORMot/bl...SynScaleMM.pas
mich würds halt interessieren ob hier wer den in Verwendung hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz