
Explication:
CPU0 = 1 = 2^0
CPU1 = 2 = 2^1
...
CPUX = ? = 2^X
et pour associer des processeurs à une tâches suffit de les additionner :
Si on veut les processeurs 1 et X par exemple :
CPU1+CPUX = 2^1+2^X
__________________
Le prog de test:
- Au démarrage lancement du gestionnaure de tâches pour pourvoir vérifier que le prog est bien associé aux processeurs chosis
- Ensuite on sélectionne le ou les processeurs à associer (par défaut le 0 est toujours associé si aucun autre n'est coché)
- Pour vérifier on sélectionne le processus dans le gestionnaire de tâches (le nom du programme est dans la barre de la fenêtre) et dans son menu contextuel (Clique droit) on sélectionne affinité et dans la fenêtre ouverte vous devait voir les mêmes processeurs de cochés. (Après chaque changement vous devez réouvrir la fenêtre affichant l'affinité des processus
ou plus rapide regarder le graph de performance et voyez les changements
Assez de blabla, testez...
Declare set_affinity(CPU)
Declare cpu_count()
; Lancement du gestionnaire de tâches
Shell_TrayWnd = FindWindow_ ( "Shell_TrayWnd" , NULL)
Result = SendMessage_ (Shell_TrayWnd, $111, 420, 0)
; Nom du programme pour le gestionnaire de tâches
ExeName.s = Space (255) : GetModuleFileName_ (0, @ExeName, 255)
Win = OpenWindow ( #PB_Any , 0, 0, 400, 200, "Dual Core Test - " + GetFilePart (ExeName), #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget )
If Win And CreateGadgetList ( WindowID (Win))
TextGadget ( #PB_Any , 10, 10, 180, 20, "Nombre de processeurs : " + Str (cpu_count()))
CPU = 0
For X = 0 To cpu_count()-1
CheckBoxGadget (X, 10, (X*25)+30, 180, 20, "CPU " + Str (X))
CPU + Pow (2, X)
SetGadgetState (X, 1)
Next
set_affinity(CPU)
Repeat
; Un bon vieux 50% d'utilisation du processeur... sans algo, bien moins sophistiqué que Dobro ; )
; avec WindowEvent à la place de WaitWindowEvent
Select WindowEvent ()
Case #PB_Event_Gadget
Event = EventGadget ()
CPU = 0
For X = 0 To cpu_count()-1
If GetGadgetState (X) = 1
CPU + Pow (2, X)
EndIf
Next
If CPU = 0
set_affinity(1)
SetGadgetState (0, 1)
Else
set_affinity(CPU)
EndIf
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
Until Quit = 1
EndIf
ProcedureDLL.l cpu_count() ; Retourne le nombre de processeur
Protected SI.SYSTEM_INFO
GetSystemInfo_ (@SI)
ProcedureReturn SI\dwNumberOfProcessors
EndProcedure
Procedure get_affinity(mode = 0) ; Mode = 0 : Process, Mode = 1 : System
Protected lpProcessAffinityMask.l, lpSystemAffinityMask.l, hProcess.l
hProcess = GetCurrentProcess_ ()
GetProcessAffinityMask_ (hProcess,@lpProcessAffinityMask,@lpSystemAffinityMask)
If mode = 0
ProcedureReturn lpProcessAffinityMask
Else
ProcedureReturn lpSystemAffinityMask
EndIf
EndProcedure
Procedure set_affinity(CPU)
Protected lpProcessAffinityMask.l, lpSystemAffinityMask.l, hProcess.l
hProcess = GetCurrentProcess_ ()
succes = SetProcessAffinityMask_ (hProcess, CPU)
ProcedureReturn succes
EndProcedure