Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programm an CPU-Kern binden (https://www.delphipraxis.net/133519-programm-cpu-kern-binden.html)

Namenloser 3. Mai 2009 21:51


Programm an CPU-Kern binden
 
Hallo Delphianer,

ich benutze in einem Spiel von mir den Performancecounter um flüssige Bewegungen darzustellen. Der Performancecounter läuft ja bekanntlich nicht auf allen CPU-Kernen synchron, daher kommt es manchmal zu Rucklern, wenn das Programm von Windows zwischen den Kernen verschoben wird. Wenn ich das Programm mit dem Taskmanager an einen Kern bindet, läuft es flüssig.

Wie stellt man das per Programmcode an? Am liebsten wäre es mir sogar, wenn man Windows irgendwie sagen könnte, dass das Programm "nur im Notfall" oder z.B. maximal alle 2 Sekunden verschoben werden darf, statt den Kern fest vorzugeben.

Ich konnte über die Suche und Google nichts dazu finden.

Vielen Dank

Dax 3. Mai 2009 21:55

Re: Programm an CPU-Kern binden
 
In der CLR heißt diese Funktion SetThreadAffinityMask, also wirst du vermutlich unter "thread affinity" etwas brauchbares finden.

Muetze1 3. Mai 2009 21:55

Re: Programm an CPU-Kern binden
 
MSDN-Library durchsuchenSetProcessAffinityMask() und MSDN-Library durchsuchenSetThreadAffinityMask()

himitsu 3. Mai 2009 22:20

Re: Programm an CPU-Kern binden
 
Zitat:

Zitat von NamenLozer
ich benutze ... den Performancecounter ...

wie DEN?
welchen denn?

der QueryPerformanceCounter ist aber kernunabhängig

und was RDTSC (Read Time-Stamp Counter) betrifft ...

vielleicht solltest du dir diese vorgehensweise nochmals überdenken.
meine CPU ist z.B. dynamisch getaket und selbst wenn du nun dein Programm an einen der Kerne bindest läuft somit der CPU-Counter (RDSTC) nicht gleihmäßig, da sich ja der CPU-Takt und somit auch der Takt des Time-Stamp-Counterständig ändert :zwinker:

Namenloser 3. Mai 2009 22:51

Re: Programm an CPU-Kern binden
 
Danke euch für die Antworten.

Ich habe jetzt noch MSDN-Library durchsuchenSetThreadIdealProcessor gefunden. Wäre das vielleicht eine bessere (weniger strikte) Lösung?

Zitat:

Zitat von himitsu
der QueryPerformanceCounter ist aber kernunabhängig

Sicher? Ich dachte immer, dass QueryPerformanceCounter kernabhängig sei. Ich glaube, dass ich diese Information urpsprünglich aus diesem Beitrag im DGL-Forum hatte. Seitdem hatte ich immer im Hinterkopf, dass QueryPerformanceCounter bei Multicore problematisch ist. Das würde sich auch mit meiner eigenen Erfahrung decken, dass einige Spiele/Programme ruckeln, wenn man sie nicht manuell einem Kern zuweist. Das kann natürlich auch andere Gründe haben.

Kann hier mal jemand Klarheit schaffen?

Mithrandir 3. Mai 2009 23:02

Re: Programm an CPU-Kern binden
 
Zitat:

Zitat von NamenLozer
Kann hier mal jemand Klarheit schaffen?

Ja, Microsoft:

Zitat:

Remarks
On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL). To specify processor affinity for a thread, use the SetThreadAffinityMask function.
Fazit: Theoretisch sollte es egal sein, praktisch eben nicht. Daher machst du so auch nichts falsch. ;)

himitsu 3. Mai 2009 23:06

Re: Programm an CPU-Kern binden
 
hmmm, ich dachte eigentlich bisher das Teil wäre unabhängig, hab aber nochma schnell nachgesehn :shock:

Zitat:

Zitat von MSDN
MSDN-Library durchsuchenQueryPerformanceCounter

On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL). To specify processor affinity for a thread, use the SetThreadAffinityMask function.

[edit] zu langsam geguckt :oops:

nja, zumindestens sollte dessen Takt hoffentlich nicht von dynamisch getakteten CPU beeinflußt werden ... hoff ich mal ... hab's nie getestet, da ich ja dachte es wäre unabhängig :angel2:

Mithrandir 3. Mai 2009 23:11

Re: Programm an CPU-Kern binden
 
Zitat:

Zitat von himitsu
nja, zumindestens sollte dessen Takt hoffentlich nicht von dynamisch getackteten CPU beeinflußt werden ... hoff ich mal ... hab's nie getestet, da ich ja dachte es wäre unabhängig :angel2:

:stupid:

Zitat:

The QueryPerformanceFrequency function retrieves the frequency of the high-resolution performance counter, if one exists. The frequency cannot change while the system is running.
Es scheint also, dass Prozessoren, die dynamisch getaktet sind, dafür sorgen müssen, dass der Wert gleich bleibt. Oder der Wert ändert sich tatsächlich, müsste man vielleicht mal mit einer entsprechenden Anwendung testen.

Muetze1 4. Mai 2009 00:37

Re: Programm an CPU-Kern binden
 
Zitat:

Zitat von Daniel G
Zitat:

The QueryPerformanceFrequency function retrieves the frequency of the high-resolution performance counter, if one exists. The frequency cannot change while the system is running.
Es scheint also, dass Prozessoren, die dynamisch getaktet sind, dafür sorgen müssen, dass der Wert gleich bleibt. Oder der Wert ändert sich tatsächlich, müsste man vielleicht mal mit einer entsprechenden Anwendung testen.

Der bleibt konstant, auch bei Power Down. Das ist so von allen x86 CPU Anbietern spezifiziert und alle halten sich dran.

Mithrandir 4. Mai 2009 00:41

Re: Programm an CPU-Kern binden
 
Zitat:

Zitat von Muetze1
Der bleibt konstant, auch bei Power Down. Das ist so von allen x86 CPU Anbietern spezifiziert und alle halten sich dran.

Ok, danke. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:01 Uhr.
Seite 1 von 2  1 2      

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