![]() |
AW: grundsätzliche Frage zu Multithreading
Und in C++ ? (darum gings ja in erster Linie :D)
Und dann noch den C# Code! :mrgreen: |
AW: grundsätzliche Frage zu Multithreading
@jfheins: Gerne doch.
Delphi-Quellcode:
void calcCSharp()
{ for (int i = 0; i < (100000000 - 1); i++) { float vecX = 5.7458F; float vecY = 3.758F; float vecZ = 7.12544F; float len = Mathf.Sqrt(vecX*vecX+vecY*vecY+vecZ*vecZ); float normX = vecX / len; float normY = vecY / len; float normZ = vecZ / len; } } |
AW: grundsätzliche Frage zu Multithreading
@Gargamel
Implementiere doch mal in allen 3 Sprachen die Funktion
Delphi-Quellcode:
exact gleich und führe dann deine Messung erneut durch. Diese Werte wären interessant im Vergleich zu sehen
type
TVector = record x,y,z: Single; end; function normalisieren(AVector: TVector): TVector; // inline; var len: Integer; begin len := sqrt(AVector.x*AVector.x+AVector.y*AVector.y+AVector.z*AVector.z); Result.x := AVector.x / len; Result.y := AVector.y / len; Result.z := AVector.z / len; end; |
AW: grundsätzliche Frage zu Multithreading
Mit dem nachfolgenden C++-Code sind es 0,8 Sekunden.
Delphi-Quellcode:
TVector normalisieren(TVector AVector)
{ float len = sqrt(AVector.x*AVector.x+AVector.y*AVector.y+AVector.z*AVector.z); AVector.x = AVector.x / len; AVector.y = AVector.y / len; AVector.z = AVector.z / len; return AVector; } __declspec(dllexport) void cppTesten() { TVector vec; for (int i=0; i< 100000000 - 1; i++) { vec.x = 5.7458F; vec.y = 3.758F; vec.z = 7.12544F; vec = normalisieren(vec); } } |
AW: grundsätzliche Frage zu Multithreading
@alle: Damit jetzt alle drei Sprachen abgedeckt wurden, hier noch der C#-Code. Die benötigte Zeit hierfür beträgt 2,9 Sekunden.
Delphi-Quellcode:
public struct TVector
{ public float x; public float y; public float z; } //////////////////////////// public TVector normalisieren(TVector AVector) { float len = Mathf.Sqrt(AVector.x * AVector.x + AVector.y * AVector.y + AVector.z * AVector.z); AVector.x = AVector.x / len; AVector.y = AVector.y / len; AVector.z = AVector.z / len; return AVector; } void calcCSharp_V2() { TVector vec; for (int i = 0; i < 100000000 - 1; i++) { vec.x = 5.7458F; vec.y = 3.758F; vec.z = 7.12544F; vec = normalisieren(vec); } } |
AW: grundsätzliche Frage zu Multithreading
Also ernsthaft.. Jetzt würde ich noch gerne den Maschinencode der normalisieren Funktion in Delphi und C++ sehen :mrgreen:
Wo spart C++ denn da über die Hälfte der Zeit? |
AW: grundsätzliche Frage zu Multithreading
Zitat:
Zitat:
Schlägt da ein Vektorisierer zu, wie bei Microsoft oder Intel ? ![]() |
AW: grundsätzliche Frage zu Multithreading
1. Für C++ habe ich Visual C++ 2010 Express verwendet. Ahnung habe ich aber nicht, welche Optimierungen da vorgenommen werden.
2. Thema Multithreading: Nehmen wir an, es ist ein QuadCore, ich erstelle 4 Threads und es gibt 4 KI-Objekte. Jedes Objekt läuft auf einem separaten Kern. Jetzt wird, auch angenommen, ständig in jedem Objekt ein Vektor normalisiert. Die vier Threads laufen über Delphi, jedoch wird die "normalisieren"-Funktion aus einer C++-DLL aufgerufen. Würde das funktionieren oder gibt es da Probleme? |
AW: grundsätzliche Frage zu Multithreading
Letztens las ich erst, dass man für intensive Berechnungen 2*CPUKerne an Threads benutzen kann.
Die aufgerufenen Funktionen laufen immer in diesem Kontext (wenn man das nicht aktiv ändert und in einen weiteren Thread übergibt) |
AW: grundsätzliche Frage zu Multithreading
Jeder Thread hat doch seinen eigenen Stack, das Beispiel mit der Vektor-Normalisierung dürfte doch problemlos klappen?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:04 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-2025 by Thomas Breitkreuz