Tutorial "AffinityMask" [JOBSCHEDULER] für Multicore-CPUs mit Beispielen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Tutorial "AffinityMask" [JOBSCHEDULER] für Multicore-CPUs mit Beispielen

      Hallo liebe Flusi-Gemeinde,

      da sehr oft nach diesen dubiösen AffinityMasks gefragt wird, und teilweise noch Unverständnis besteht, dachte ich mir, dieses kleine Tutorial zu schreiben. Ich möchte nicht mit fachchinesischen Begriffen umherschmeissen, noch möchte ich euch erklären, was ein Bit und ein Byte ist. Ziel dieses kleinen Tutorials ist es, dass ihr im Nachhinein gezielt eure Kerne auswählen könnt, die ihr auch von FSX genutzt haben wollt. Und los geht's:

      Kleine Lehrstunde zwischendurch:
      Was ist der Unterschied zwischen Thread und Kern? Also: ein Kern ist physisch vorhanden, das ist fest in der CPU verankert. Eine 4-Kern-CPU hat IMMER 4 Kerne, da ändert sich auch nix. Ein 6-Zylinder-Motor hat IMMER 6 Zylinder (ausser Betracht gelassen, ob er auch funktioniert oder nicht :D ). Also physikalisch gesehen hat eine x-kernige CPU immer x Kerne. Zum jetzigen Zeitpunkt gibt es für die Otto-Normal-Verbraucher 6-Kerner. Ein Thread ist so etwas wie ein Teil eines Prozesses, so etwas wie "Arbeitsvorgang". Ich kann's schwer auf deutsch übersetzen, aber ihr werdet's im Verlauf dieses Tutorials verstehen lernen.

      Ein normaler 4-Kern-AMD Prozessor hat zum Beispiel 4 Kerne, und auch nur 4 Threads. Warum? Weil auf jedem Kern EIN Thread läuft. Ein Intel 4-Kerner bietet die Hyperthread-Technologie. Wie der Name schon vermuten lässt, hier können auf einem physischen Kern gleichzeitig 2 Threads (=Arbeitsvorgänge) ausgeführt werden. Die i7-CPUs unterstützen diese Technologie. Die i5 nicht, deswegen sind sie auch günstiger. Also hat ein i7-Prozessor mit eingeschaltetem Hyperthreading insgesamt 8 Threads zur Verfügung.

      Die Threads werden immer mit CPUx bezeichnet, wobei man beim ersten Thread mit der Bezeichnung 0 anfängt. Beispiel:

      AMD-CPU mit 4 Kernen und 4 Threads:
      Kern1 --- Thread 1 ==> CPU0
      Kern2 --- Thread 1 ==> CPU1
      Kern3 --- Thread 1 ==> CPU2
      Kern4 --- Thread 1 ==> CPU3

      Jeder Kern liefert also exakt einen Thread. Die CPU hat also insgesamt 4 Threads, die heissen CPU0, CPU1, CPU2 und CPU3.

      Beim Intel i7 mit eingeschaltetem Hyperthreading sieht's nun anders aus:
      Kern1 --- Thread 1 ==> CPU0
      Kern1 --- Thread 2 ==> CPU1
      Kern2 --- Thread 1 ==> CPU2
      Kern2 --- Thread 2 ==> CPU3
      Kern3 --- Thread 1 ==> CPU4
      Kern3 --- Thread 2 ==> CPU5
      Kern4 --- Thread 1 ==> CPU6
      Kern4 --- Thread 2 ==> CPU7

      Jeder Kern liefert also zwei Threads. Die CPU hat insgesamt 8 Threads zur Verfügung, die heissen CPU0, CPU1, CPU2, CPU3, CPU4, CPU5, CPU6 und CPU7.
      Würde man HT ausschalten, dann verhält es sich wieder so wie im AMD-Beispiel beschrieben, und man hätte nur 4 Threads zur Verfügung.

      Soweit alles klar? Super. Jetzt werden vielleicht einige denken "Na super! Dann hol ich mir 'nen i7, schalte HT ein und stell meinen FSX so ein, dass 8 Threads verwendet werden, das wäre ja so wie eine 8-Kern-CPU." und anschliessend schnall ich ihn fest am Schreibtisch, damit er mir nicht davonfliegt.... *träum* PUSTEKUCHEN! Ist leider nicht so :P die Hyperthreads sind eine Art virtualisierte Kerne. Die Anwendung muss auch explizit für so etwas programmiert worden sein, damit die solche extra Threads auch ausnutzen kann, um das bestmöglichste Potential rauszuholen. Ich möchte jetzt nicht tiefer darauf eingehen, das würde definitiv den Rahmen sprengen und wir wollen ja alles simpel betrachten. Und jetzt ratet mal, ob der FSX mit solchen Hyperthreads umgehen kann. Tadaaa!!! Richtig geraten, er kanns natürlich NICHT :rolleyes: Zumindest euer Taskmanager wird euch verwirren und anzeigen, dass diese zusätzlcihen Threads zwar laufen, aber ihr habt definitiv keinen Performancegewinn. Im Gegenteil, das kann sogar Probleme verursachen (Timings, Sync, usw...) Wie auch immer. Ich hoffe bisher ist alles klar. Weiter geht's ...

      1.) Wir wollen nun dem FSX dirigieren, welche Threads er verwenden soll, und welche nicht. Ohne auf die Hintergründe einzugehen, warum man so etwas machen sollte oder nicht, erkläre ich euch nun, wie das funktioniert. In der FSX.CFG wird hierfür der Eintrag erstellt (falls nicht vorhanden):

      [JOBSCHEDULER]
      AffinityMask=xyz


      Mit dem Wert xyz veranlassen wir dem FSX bestimmte Threads zu verwenden. Jetzt müssen wir diesen dezimalen Wert jedoch erstmal ausrechnen. Und zwar von BINÄR zu DEZIMAL.
      Das können wir mit dem Windows-Rechner sehr einfach durchführen.

      2.) Startet den Taschenrechner, der in eurem Windows enthalten ist. Dazu klickt ihr auf [START]-->[Programme]-->[Zubehör]-->"RECHNER". Falls ihr ihn nicht finden könnt, klickt einfach auf [START]-->[AUSFÜHREN]--> und gebt in das Feld "calc" und bestätigt mit OK oder der Enter-Taste.

      3.) Der Rechner ist nun gestartet und ihr sehr ihn als Fenster auf eurer Oberfläche. Klickt an diesem Fenster oben auf [ANSICHT] und wählt den Modus "WISSENSCHAFTLICH"

      4.) Jetzt benötigen wir die BIN Funktion um den gewünschten Zustand zu beschreiben.



      Ich klicke mit der Maus erstmal auf die Funktion "BIN", weil ich in dem Binärformat meinen gewünschten Zustand eingeben möchte. In diesem Modus kann man nur Nullen oder Einsen eingeben, deswegen werden alle anderen Ziffern auch ausgegraut und stehen nicht zur Verfügung. Die Ziffer 1 bedeutet EIN, die Ziffer 0 bedeutet AUS. Ich hab in dem Beispiel 11111100 eingegeben. Was heisst das nun? Wir sehen, ich habe 8 Ziffern insgesamt eingegeben. Also gehe ich von 8 Threads aus, z.B. ein Intel i7 mit aktiviertem HT. Jede einzelne Ziffer beschreibt den Zustand eines Threads und wird von rechts nach links gelesen. Die Ziffer ganz rechts beschreibt den Zustand des 1.Threads, die vorletzte Ziffer also den 2.Thread, die vorvorletzte Ziffer den 3.Thread, usw...

      Der erste Thread ist also AUS, da ich die Null verwende. Der zweite Thread auch auf AUS, da die Null steht. Der dritte Thread ist EIN, der vierte Thread ist EIN, der fünfte auch, usw... alle anderen sind EIN, da ich Einsen verwende. Hier nochmal der Überblick:

      Kern1 --- Thread 1 ==> CPU0 (die letzte Ziffer ganz rechts, eine Null, also --> AUS!)
      Kern1 --- Thread 2 ==> CPU1 (die vorletzte Ziffer von rechts, eine Null, also --> AUS!)
      Kern2 --- Thread 1 ==> CPU2 (die vorvorletzte Ziffer von rechts, eine Eins, also --> EIN!)
      Kern2 --- Thread 2 ==> CPU3 (hier die Ziffer eins, also EIN!)
      Kern3 --- Thread 1 ==> CPU4 (hier die Ziffer eins, also EIN!)
      Kern3 --- Thread 2 ==> CPU5 (hier die Ziffer eins, also EIN!)
      Kern4 --- Thread 1 ==> CPU6 (hier die Ziffer eins, also EIN!)
      Kern4 --- Thread 2 ==> CPU7 (hier die Ziffer eins, also EIN!)

      Ich hab hier quasi durch die Ziffer 11111100 gesagt, dass der erste Kern mit seinen zwei Kernen (also CPU0 und CPU1) komplett ausgeschaltet werden soll. Alle anderen folgenden Threads sind aktiviert.

      5.) Jetzt müssen wir diese Binärzahl in eine dezimale umwandeln, damit wir sie in die FSX.CFG eintragen. Dazu klicken wir jetzt einfach auf den Button "DEZ" und sehen nun sofort dass im Rechner die Zahl "252" angezeigt wird. Das ist die gesuchte Zahl für unsere AffinityMask. Würde ich also jetzt in die FSX.CFG schreiben:

      [JOBSCHEDULER]
      AffinityMask=252

      dann sagen wir dem FSX dadurch, dass er CPU2, CPU3, CPU4, CPU5, CPU6 und CPU7 verwenden soll. Also alle Threads, ausser die ersten zwei (CPU0 und CPU1).

      Ich hoffe ihr habt das verstanden. Zur Verdeutlichung folgen nun noch

      ==> einige Beispiele:

      Wir möchten z.B. bei einem 4-Kern AMD Prozessor nur den dritten und vierten Kern verwenden. Die Binärzahl hierfür wäre 1100. Wenn wir das im Rechner im BIN-Format eingeben und dann auf DEZ klicken, kriegen wir die Zahl 12 als Ergebnis. Also müssten wir in unserer FSX.CFG die AffinityMask=12 eingeben, um diesen Zustand zu erhalten.

      Hier einige Beispiele für AMD 4-Kern Prozessoren (4 Threads):
      CPU0 EIN, CPU1 EIN, CPU2 EIN, CPU3 EIN ==> Binärzahl lautet 1111, AffinityMask=15
      CPU0 AUS, CPU1 EIN, CPU2 EIN, CPU3 EIN ==> Binärzahl lautet 1110, AffinityMask=14
      CPU0 AUS, CPU1 AUS, CPU2 AUS, CPU3 EIN ==> Binärzahl lautet 1000, AffinityMask=8
      CPU0 EIN, CPU1 AUS, CPU2 EIN, CPU3 AUS ==> Binärzahl lautet 0101, AffinityMask=5

      Hier einige Beispiele für INTEL 4-Kern Prozessoren mit eingeschaltetem HT (8 Threads):
      CPU0 AUS, CPU1 AUS, CPU2 bis CPU7 EIN ==> Binärzahl lautet 11111100, AffinityMask=252
      CPU0 EIN, CPU1 AUS, CPU2 EIN, CPU3 AUS, CPU4 EIN, CPU5 AUS, CPU6 EIN, CPU7 AUS ==> Binärzahl lautet 01010101, AffinityMask=85 (hier sagen wir also dem FSX, er soll immer nur den ersten Thread jedes Kernes verwenden, also den Hyperthread NICHT verwenden)
      CPU0 bis CPU3 AUS, CPU4 bis CPU7 EIN ==> Binärzahl lautet 11110000, AffinityMask=240 (hier sagen wir dem FSX, er soll nur den dritten und vierten Kern inkl. dessen Hyperthreads verwenden, die ersten zwei Kerne werden komplett ausgeschaltet)

      Beachte: mit "ausgeschaltet" meine ich lediglich den Zustand, dass FSX diesen NICHT verwendet. Der Thread ist physikalisch natürlich in Windows noch vorhanden :P also diese Info nur um Missverständnisse vorzubeugen. :rolleyes:


      Hier einige Beispiele für AMD 6-Kern Prozessoren: (6 Threads)
      CPU0 AUS, CPU1 bis CPU5 EIN ==> Binärzahl lautet 111110, AffinityMask=62 (also den ersten Kern ausschalten)
      CPU0+1 AUS, CPU2 bis CPU5 EIN ==> Binärzahl lautet 111100, AffinityMask=60 (also die ersten zwei Kerne ausschalten)
      CPU0 EIN, CPU1 AUS, CPU2 EIN, CPU3 AUS, CPU4 EIN, CPU5 AUS ==> Binärzahl lautet 010101, AffinityMask=21

      Hier einige Beispiele für Intel 6-Kern Prozessoren mit aktiviertem HT: (12 Threads)
      CPU0+1 AUS, alle restlichen zehn Threads EIN ==> Binärzahl lautet 111111111100, AffinityMask=4092 (ersten Kern inkl. Hyperthread ausschalten, der Rest alles an)
      CPU0-3 AUS, alle restlichen 8 Threads EIN ==> Binärzahl lautet 111111110000, AffinityMask=4080 (die ersten zwei Kerne inkl. deren Hyperthreads ausschalten, der Rest an)
      CPU0 EIN, CPU1 AUS, CPU2 EIN, CPU3 AUS, CPU4 AUS, CPU5 EIN, usw... ==> Binärzahl lautet 010101010101, AffinityMask=1365 (die Hyperthreads jedes Kernes ausschalten)

      Würde man einen Intel 6-Kern ohne aktiviertem HT betreiben, verhält es sich genauso wie beim 6-Kerner AMD, also ohne Hyperthreads, das heisst ingesamt 6 Threads zur Verfügung.


      Und jetzt noch zwei drei Beispiele umgekehrt. Also man hat z.B. eine AffinityMask und würde gerne wissen was diese bedeutet. Ich nenn jetzt einfach mal 3 AffinityMasks und löse umgekehrt auf und beschreibe was das bedeutet. Wir geben im Rechner also in der Funktion "DEZ" die Zahl ein, und drücken dann mit der Maus auf die Funktion "BIN" und erhalten die Binärzahl.

      AffinityMask=139 ==> Binärzahl 10001011. Heisst also es werden 8 Threads verwendet da 8 Ziffern: CPU0 EIN, CPU1 EIN, CPU2 AUS, CPU3 EIN, CPU4 AUS, CPU5 AUS, CPU6 AUS, CPU7 EIN.

      AffinityMask=1024 ==> Binärzahl 10000000000. Würde bedeuten es werden 11 Threads verwendet 8) und in dem Fall würde nur der letzte Thread aktiv sein ,alle anderen wären AUS. Aber keine Bange, es gibt keinen 11kernigen Prozessor, dieses Beispiel ist also nur ein fiktives Beispiel.

      AffinityMask=2730==> Binärzahl 101010101010. Das sind 12 Ziffern, also haben wir hier 12 Threads, sprich einen 6-kernigen Intel mit aktiviertem HT, und es wird immer nur der Hyperthread jedes einzelnen Kernes verwendet.

      Soooo, ich hoffe dem einen oder anderen ein klein wenig geholfen zu haben. Wer Rechtschreibfehler findet, darf sie behalten. :)

      So long,
      Pegasus.
      Intel i7-920 @4 GHz, 12GB RAM OCZ Platinum @1.646MHz,Sapphire HD-5870 Vapor-X, 30" Dell @2560x1600, TrackIR 5, Win7 64bit
      PEGASUS' Bilder-Thread

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Pegasus ()

    • hoernchen schrieb:

      Und den Eintrag füge ich an welcher Stelle ein? Ist's egal?


      Die Antwort steht im Text und im Titel!:

      [JOBSCHEDULER]
      AffinityMask=252

      Die AffinityMask ist auch kein "Framewunder", sondern dient nur dazu, das der durch Windows und andere Programme ggf bereits in Anspruch genommene erste Thread/CPU nicht zum primären FSX Thread wird und somit dieser sich die Resource teilen muss. Das wirkt sich dann ggf eher in verringertem Hängen und Ruckeln aus weniger in gesteigerter Geschwindigkeit, dafür sind dann andere Parameter relevant, die sind aber hier nicht in der Diskussion.
      mfg
      Oliver Pabst

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von opabst ()


    • Die Antwort steht im Text und im Titel!:


      Ich denke eher er meint ob es egal ist ob er den gesamten Eintrag an den Anfang, die Mitte oder das Ende der fsx.cfg reinkopiert, da er ja Standardmässig nicht vorhanden ist.

      Antwort: Ja es ist egal. ich hab ihn gleich an den Anfang reinkopiert, also noch über die [Graphics] Einträge.
      Gruß Thomas
      CPU + MB i7 2600K@4,4 Ghz + Asus P8P67 Graka Nvidia Zotac GTX 770 4GB Displays 3x Samsung 46" UE46F6500 SSDs OCZ 120GB (Win7 64) + Crucial 256GB (FSX) RAM 16GB DDR3-1333

      Mein Homecockpitbauthread sowie D-ABCH Dropbox Bildersammlung
    • Hallo Pegasus,

      habe erst jetzt beim Googeln Dein Tutorium entdeckt. Nun bin ich endlich aufgeklärt! Ich finde Deinen Beitrag so gut, dass Du ihn eigentlich in der FlightXPress veröffentlichen solltest.

      Gruß
      Fritz
      Friburg, Mitglied im FlightXPress Forum seit Sep 2007.
    • humungushh schrieb:

      Antwort: Ja es ist egal. ich hab ihn gleich an den Anfang reinkopiert, also noch über die [Graphics] Einträge.


      Genau das meinte ich ;)
      Dankesehr :)
      HIER GIBTS REALE FLUGVIDEOS

      Operating System: Windows 7 Home Premium 64-bit
      CPU: AMD Phenom X4 9750
      Agena 65nm Architecture
      RAM: 8.0GB Samsung Dual-Channel DDR2 @ 400MHz
      Grafik: 512MB ATI Radeon 3200 Graphics
      512MB ATI Radeon 4800 Series

      FSX SP2 Saitek Pro Flight Yoke + Throttle
    • etwas verwirrend......

      Danke für deine Arbeit. leider ist das Caos in meinen Kopf noch doller geworden.
      Ich habe einen Intel Core2 Quad in mein rechner. Also 4 Kerne. (denke ich mal), nun habe ich den Wert =14 eingetragen und hoffe das es richtig ist. Die Frage stellt sich mir, wie bekomme ich mit, dass INTEL 4-Kern Prozessoren mit eingeschaltetem HT (8 Threads) auch da ist. ????? Was ich weiß ist. Core2Quad. Aber ob das Ding nun eingeschaltete HT (8 Threads) aktiviert hat oder nicht?????? Wer soll das wissen?

      Ist nun der Wert =14 richtiug oder trifft eher =252 zu? Da steige ich nicht so richtig durch.
      Bitte sagt mir den richtigen Wert.
      Danke vorab sagt der Jörg
      Janicki, Mitglied im FlightXPress Forum seit Sep 2001.
    • Hallo Jörg,

      da du keinen i7 Prozessor verwendest, sondern nur einen Core2 Quad, unterstütz deine CPU kein Hyperthreading. Du hast also immer nur max. 4 Kerne am Laufen.

      Im Fall, dass du den ersten Kern deaktivieren möchtest, wäre für dich AffinityMask=14 richtig. Hoffe ich konnte dir helfen.

      Viele Grüsse,
      Pegasus.
      Intel i7-920 @4 GHz, 12GB RAM OCZ Platinum @1.646MHz,Sapphire HD-5870 Vapor-X, 30" Dell @2560x1600, TrackIR 5, Win7 64bit
      PEGASUS' Bilder-Thread
    • hallo Jörg,

      das ist ganz einfach: du startest den Taskmanager, gehst auf den Reiter Leistung und siehst dann oben, wie viele Scopes für die CPU zu sehen sind (obere Reihe). Sind dort vier zu sehen, ist HT aus, bei acht ist HT eingeschaltet. Ich empfehle dir, HT auszuschalten.

      mfg Kai
      Kai-Uwe Weiß, Mitglied im neuen FlightXPress Forum seit Sep 2007.
      Hardware: Gigabyte X79-UD3
      CPU: Sandy-Bridge E Core i7 3930k @4,3Ghz
      MSI GTX 980Ti
      24 GB RAM
      Windows 7 Ultimate 64
      P3Dv3.4

      "Der perfekte Sklave weiß nicht, das er ein Sklave ist."
    • [JOBSCHEDULER]
      AffinityMask=255

      Der Eintrag reagiert nicht bei meinem i7-Core / Win 7 64 bit System. Im Taskmanager ruhen CPU 1-7 und CPU 0 läuft bei Höchstlast. Erst nach dem ich im Ressourcenmonitor die CPUs für fsx.exe aus/-und zuschalte springen alle 8 an. Mache ich irgendetwas falsch oder ist der Tweak nicht mehr tauglich für 2012?
    • 3.) Der Rechner ist nun gestartet und ihr sehr ihn als Fenster auf eurer Oberfläche. Klickt an diesem Fenster oben auf [ANSICHT] und wählt den Modus "WISSENSCHAFTLICH"

      4.) Jetzt benötigen wir die BIN Funktion um den gewünschten Zustand zu beschreiben.



      Ich finde Rechner "WISSENSCHAFTLICH" über BIN nicht???? (Windows 7 Pro), sondern Ansicht > "PROGRAMMIERER" auch??

      Sebi
      FSX ->
      PC Office/FSCom 9.5/WideClient/Active Sky Next/REX 4 ->

      Ich bin gehörlos! Obwohl ich wirklich mein
      Bestes versuche, sind meine sprachlichen Möglichkeiten
      sehr begrenzt: Ich werde Fehler machen.