![]() |
grundsätzliche Frage zu Multithreading
Hi
Die Tage habe ich die Geschwindigkeit von C#, Delphi und C++ getestet. Dazu habe ich in einer 10-Mio.-For-Schleife einen Vektor normalisiert. Dabei kam heraus, dass C# dafür 1,5 Sekunden benötigt. Delphi 0,5 Sekunden und C++ irgendwas um 0,003 Sekunden. Dass C# am langsamsten ist, dachte ich mir fast. Aber der Unterschied zwischen Delphi und C++ ist arg groß. Da ich nun für meine KI jeden Leistungsvorteil nutzen möchte, will ich sämtliche Berechnungen über C++ erledigen, wobei die Verwaltung der KI selbst in Delphi erfolgt. (Ich mag halt Delphi und will C++ nur dann nutzen, wenn es unbedingt nötig ist) Der Aufbau sieht so aus: Hauptprogramm(3D-Engine) --> KI(Delphi-DLL) --> reine Berechnungen(C++-DLL) Was mich nun interessieren würde ist, inwieweit sich das mit Multithreading vereinbaren lässt. In der Delphi-DLL werden, z.B. bei einem Quad-Core, 4 Threads erstellt, die ständig auf exportierte Funktionen der C++-DLL zugreifen (Pathfinding, Fuzzy-Logic, usw.). Geht das so überhaupt? Danke |
AW: grundsätzliche Frage zu Multithreading
Ich sehe jetzt nicht ganz, eine weitere "Zwischen-DLL" überhaupt nötig ist, aber noch eher glaube ich, dass man den generellen Performance-Unterschied jetzt nicht an einer Vektor-Operation festmachen sollte. Ich glaube nicht, dass es so einen argen Unterschied gibt... :oops:
|
AW: grundsätzliche Frage zu Multithreading
Eine weitere Idee um es ggf. in Delphi noch schneller zu kriegen:
1. inline funktion 2. inline assembler (ggf. sogar mit MMX, SSE ?) Dann sparst du dir den ganzen C++ Kram. |
AW: grundsätzliche Frage zu Multithreading
Und wenn man wirklich das letzte Bischen herausquetschen will, wäre
![]() ![]() |
AW: grundsätzliche Frage zu Multithreading
@Günther
Wie gesagt, die reine Verwaltung mache ich lieber in Delphi. Nur den Mathe-Kram würde ich gerne wegen der Geschwindigkeit auslagern. @General Inline Assembler kann ich nicht nutzen, da der 64bit-Delphi-Compiler sowas nicht kann. (Delphi XE3) |
AW: grundsätzliche Frage zu Multithreading
@Medium:
Mit CUDA binde ich mich leider an nVidia. Für ein Spiel ist das nicht sinnvoll. OpenCL hingegen klingt ganz gut. |
AW: grundsätzliche Frage zu Multithreading
@Gargamel: Soweit ich weiß kannst du zwar keine kompletten inline-Funktionen mit asm - end machen aber du kannst glaube ich sowas machen:
Delphi-Quellcode:
? Kann mich aber auch täuschen.
begin
asm end; end; Ansonsten probier mal deine Funktion zum normalisieren von Vektoren mit inline; zu markieren. Ich denke das sollte wie gesagt auch noch mal etwas bringen. |
AW: grundsätzliche Frage zu Multithreading
Es wäre sowieso kein gültiger Vergleich, wenn beide Algorithmen nicht zu 100% identisch ablaufen. Dh. wenn in C++ geinlinet wird, dann muss in Delphi das auch geschehen und vice versa. Von daher ist es eig. relativ egal.
Ich würde übrigens gerne Code sehen... |
AW: grundsätzliche Frage zu Multithreading
Das gehört hier wahrscheinlich nicht mehr hin.
Aber gibt es überhaupt Nvidia-Karten mit OpenCL? Ich dachte die bleiben weiterhin bei CUDA. Auch haben Sie das Format geöffnet, vielleicht springt ja sogar ATI auf diesen Zug auf... |
AW: grundsätzliche Frage zu Multithreading
Ein Unterschied von 2-5% zwischen den einzelnen Compilern ist durchaus denkbar, deine Ergebnisse mit hundertfacher Laufzeit deuten aber eher auf Fehler in der Implementierung hin.
Assembler ist wirklich nur das letzte Mittel, wenn alle anderen Optimierungen schon durch sind. OpenCL scheint hier der bessere Weg zu sein. Multithreading und DLL-Aufrufe geht natürlich, sofern die Funktionen in der DLL auch threadsicher implementiert sind oder nur von einem Thread verwendet werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz