AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie den CPU-Cores Threads zuordnen mit SetThreadAffinityMask
Thema durchsuchen
Ansicht
Themen-Optionen

Wie den CPU-Cores Threads zuordnen mit SetThreadAffinityMask

Ein Thema von DevidEspenschied · begonnen am 10. Mär 2009 · letzter Beitrag vom 10. Mär 2009
Antwort Antwort
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
439 Beiträge
 
Delphi 12 Athens
 
#1

Wie den CPU-Cores Threads zuordnen mit SetThreadAffinityMask

  Alt 10. Mär 2009, 12:34
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.
Devid
Devid Espenschied
Pre-sales Consultant
Embarcadero Germany GmbH
germany.info@embarcadero.com

Kein Support per PN
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Wie den CPU-Cores Threads zuordnen mit SetThreadAffinity

  Alt 10. Mär 2009, 15:27
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
439 Beiträge
 
Delphi 12 Athens
 
#3

Re: Wie den CPU-Cores Threads zuordnen mit SetThreadAffinity

  Alt 10. Mär 2009, 16:02
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 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.
Devid
Devid Espenschied
Pre-sales Consultant
Embarcadero Germany GmbH
germany.info@embarcadero.com

Kein Support per PN
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Wie den CPU-Cores Threads zuordnen mit SetThreadAffinity

  Alt 10. Mär 2009, 16:04
Wenn du mehrere Prozessoren erlauben willst, musst du die Bitmasken verodern. Das sollte nicht allzu überraschend sein.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
439 Beiträge
 
Delphi 12 Athens
 
#5

Re: Wie den CPU-Cores Threads zuordnen mit SetThreadAffinity

  Alt 10. Mär 2009, 16:14
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).
Devid
Devid Espenschied
Pre-sales Consultant
Embarcadero Germany GmbH
germany.info@embarcadero.com

Kein Support per PN
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Wie den CPU-Cores Threads zuordnen mit SetThreadAffinity

  Alt 10. Mär 2009, 16:19
Korrekt. Das entspricht dann also (1 shl 4) or (1 shl 5) = 16 or 32 = 48.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:06 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