Best Practice für Stoppuhr in Multiprozessoren Maschine?

8

Ich habe eine gute Frage zum Messen der Funktionsleistung, und die Antworten empfehlen die Verwendung der Stoppuhr wie folgt

%Vor%

Aber ist das gültig, wenn Sie unter Mehrprozessormaschine laufen? Der Thread kann auf einen anderen Prozessor umgeschaltet werden, oder? Auch das sollte in Enviroment.TickCount sein. Wenn die Antwort ja ist, sollte ich meinen Code innerhalb von BeginThreadAffinity wie folgt einpacken

%Vor%

P.S

Das Umschalten kann nicht nur auf der Ebene des Prozessors, sondern auch auf der Ebene des Threads erfolgen. Wenn die Funktion beispielsweise in einem anderen Thread läuft, kann das System auf einen anderen Prozessor umschalten. Ist die Stoppuhr nach diesem Wechsel gültig?

Ich verwende nicht nur die Stoppuhr für die Leistungsmessung, sondern auch die Timer-Funktion mit Thread.Sleep (um Anrufüberschneidungen zu vermeiden)

    
Ahmed Said 19.07.2009, 08:40
quelle

2 Antworten

5

Wenn die Funktion selbst nicht Multithread ist (z. B. erzeugt sie keine anderen Threads / Prozesse und wartet darauf, dass sie beendet werden), dann ist das einzige Problem Ihr Rechner.

Wenn Ihr Computer mit anderen Dingen beschäftigt ist, kann Ihr Test ungültig werden (z. B. Kodierung eines H.264-Videos bei einem CPU-gebundenen Test). Wenn Sie den gesamten physischen Speicher verwenden, um etwas zu testen, das an den Speicher gebunden ist, kann dies ebenfalls die Ergebnisse ungültig machen.

Das allgemeine Prinzip besagt, dass die Maschine bei der Durchführung solcher Tests unter einer minimalen bis normalen Belastung stehen sollte. Ansonsten gibt es kein Multiprocessing-Problem. Ja, das Programm könnte Kerne austauschen, während es läuft, aber der Aufwand hierfür ist entweder ein winziger Prozentsatz Ihrer gemessenen Zeit oder die gemessene Zeit ist so klein, dass die Granularität der Zeitmessung des Systems ein Problem darstellt.

    
cletus 19.07.2009 08:48
quelle
2

Ich denke, Sie fragen nach der Low-Level-Implementierung von Stoppuhr und ob das Umschalten von Prozessoren mitten in der Ausführung das Verhalten ungültig machen könnte. Die Implementierung verwendet QueryPerformanceCounter intern (siehe die MS BCL-Referenzquellen; ich habe es zumindest in .NET 4.0 bestätigt).

Die MS-Dokumentation dafür API-Status:

  

Auf einem Multiprozessor-Computer sollte es keinen Unterschied machen, welcher Prozessor ist   namens. Sie können jedoch unterschiedliche Ergebnisse auf verschiedenen Prozessoren erhalten   aufgrund von Fehlern im BIOS (Basic Input / Output System) oder der Hardware   Abstraktionsschicht (HAL).

Also, Sie haben Recht; Im Prinzip sollte das keine Rolle spielen, aber dieser Kommentar legt nahe, dass Fälle beobachtet wurden, in denen die Implementierung nicht der beabsichtigten Schnittstelle entspricht. Wenn Sie die Korrektheit der Messung garantieren möchten, können Sie, wie Sie angegeben haben, die Thread-Affinität verwenden. Das heißt, ich vermute, dass alle beobachteten Fehler ziemlich klein sind, da ein großer Unterschied ein ziemlich ernsthafter BIOS- oder HAL-Fehler sein würde.

    
Dan Bryant 21.11.2011 21:26
quelle

Tags und Links