Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie den CPU-Cores Threads zuordnen mit SetThreadAffinityMask (https://www.delphipraxis.net/130550-wie-den-cpu-cores-threads-zuordnen-mit-setthreadaffinitymask.html)

devidespe 10. Mär 2009 11:34


Wie den CPU-Cores Threads zuordnen mit SetThreadAffinityMask
 
Hallo,

ich habe eine Beispielanwendung mit 8 verschiedenen Threads, die ich basierend auf einem Intel Core i7 System den 8 Kernen zuordnen möchte. Der Core i7 hat ja 4 physikalische Kerne und jeder Kern verfügt über einen zusätzlichen HyperThreading-Kern, also insgesamt 8 Kerne (das zeigt auch der Taskmanager an).

Nun verwende ich in den Thread-Create Funktionen die Funktion SetThreadAffinityMask, und als Übergabewert verlangt diese Funktion ein Handle, was ich auch korrekt übergebe, sowie die sogenannte dwThreadAffinityMask. Leider finde ich nun aber keine Infos, wie diese AffinityMask aussehen muss, um den Thread etwa dem 5. Kern zuzuweisen.

Auch die MSDN-Doku hilft hier nicht weiter: MSDN.

Kann mir da jemand helfen ? Ich vermute, es ist eine Bit-basierte Geschichte, also etwa Bit X für Kern X.

Apollonius 10. Mär 2009 14:27

Re: Wie den CPU-Cores Threads zuordnen mit SetThreadAffinity
 
Zitat:

A thread affinity mask is a bit vector in which each bit represents a logical processor that a thread is allowed to run on.
Wenn du also dem Thread nur erlauben willst, auf einem einzigen Prozessor zu laufen, nimm 1 shl n als Parameter, wobei n die nullbasierte Prozessornummer ist.
Aber gibt es einen bestimmten Grund, warum du den Vorschlaghammer verwendest? Möglicherweise genügt MSDN-Library durchsuchenSetThreadIdealProcessor.

devidespe 10. Mär 2009 15:02

Re: Wie den CPU-Cores Threads zuordnen mit SetThreadAffinity
 
Zitat:

Zitat von Apollonius
Wenn du also dem Thread nur erlauben willst, auf einem einzigen Prozessor zu laufen, nimm 1 shl n als Parameter, wobei n die nullbasierte Prozessornummer ist.

Diese Methode ist mir bereits von SetProcessAffinityMask bekannt, ich wusste nur eben nicht, ob dies auf SetThreadAffinityMask auch zutrifft.

Problematisch ist allerdings, wenn ich von den 8 Kernen etwa nur Kern 1 und 2 ansprechen möchte. Ich glaube, da hat das Shiften seine Grenzen...

Zitat:

Zitat von Apollonius
Aber gibt es einen bestimmten Grund, warum du den Vorschlaghammer verwendest? Möglicherweise genügt MSDN-Library durchsuchenSetThreadIdealProcessor.

Es handelt sich um einen Belastungstest, der die Kerne gezielt mit Aufgaben füttert. Daher kann dem Betriebssystem leider nicht die Auswahl eines geeigneten Kernes überlassen werden.

Apollonius 10. Mär 2009 15:04

Re: Wie den CPU-Cores Threads zuordnen mit SetThreadAffinity
 
Wenn du mehrere Prozessoren erlauben willst, musst du die Bitmasken verodern. Das sollte nicht allzu überraschend sein.

devidespe 10. Mär 2009 15:14

Re: Wie den CPU-Cores Threads zuordnen mit SetThreadAffinity
 
Zitat:

Zitat von Apollonius
Wenn du mehrere Prozessoren erlauben willst, musst du die Bitmasken verodern. Das sollte nicht allzu überraschend sein.

So wie ich das sehe, stehen etwa die ersten 8 Bits für die einzelnen Kerne. Bit 0 steht für Kern 1 und Bit 7 für Kern 8.

Bit <-> Kern
0 <-> 1
1 <-> 2
2 <-> 3
3 <-> 4
4 <-> 5
5 <-> 6
6 <-> 7
7 <-> 8

Wenn ich etwa die Kerne 5 und 6 ansprechen möchte, muss ich die Bits 4 und 5 setzen (mit der Oder-Verknüpfung).

Apollonius 10. Mär 2009 15:19

Re: Wie den CPU-Cores Threads zuordnen mit SetThreadAffinity
 
Korrekt. Das entspricht dann also (1 shl 4) or (1 shl 5) = 16 or 32 = 48.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:50 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