Page 3 sur 3

Publié : dim. 20/janv./2008 3:40
par Gillou
Petite précision, j'avais commis une erreur par rapport au numéro renvoyé par get_affinity, (...Premier signe de fatigue ;) )

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

Publié : dim. 20/janv./2008 11:51
par Backup
Merci de t'etre mis a la tache !! cela me servira dans le futur, lorsque j'aurai un multicore !! :)

Publié : dim. 20/janv./2008 15:21
par Gillou
Pas de pb, c'est un forum d'entraide non ;)

Par contre si certains pouvaient tester :D

Publié : lun. 21/janv./2008 11:23
par Eric
Cela fonctionne nikel. avec Quad 6600

Un grand merci aux pro du forum

Eric

Publié : mar. 22/janv./2008 10:01
par SPH
Ca fonctionne aussi sur un proc E4500 (intel 2 core)

Publié : lun. 04/févr./2008 16:41
par comtois
vous en rêviez ? Freak l'a fait !

http://www.purebasic.fr/english/viewtop ... 73&start=6

Et mieux , il parle de le mettre en natif !!
Reste à voir si Fred sera d'accord :)

Publié : lun. 04/févr./2008 17:03
par wolfjeremy
Ca donne quoi en fr ? lol

C'est pour travailler sur les différent core dispo ?

Publié : lun. 04/févr./2008 17:34
par comtois
oui.

J'ai lu un article sur le ParallelFor sur le site microsoft, il donnait l'exemple d'un raytracing, algorithme gourmand en calcul, en prenant un code existant il pouvait calculer 1,7 image par seconde sur un 8 coeurs. rien qu'en changeant les boucles for par un parallelFor, le même algo calculait 12 images par seconde, soit 7 fois plus vite !! une petite modif de rien du tout, ça vaut le coup.

Publié : lun. 04/févr./2008 17:54
par wolfjeremy
Ha ouai quand même ! 8O
Ca peut booster nos jeux amateurs n'empêche !

Publié : lun. 04/févr./2008 20:37
par Backup
comtois a écrit :vous en rêviez ? Freak l'a fait !

http://www.purebasic.fr/english/viewtop ... 73&start=6

Et mieux , il parle de le mettre en natif !!
Reste à voir si Fred sera d'accord :)
n'empêche qu'on y a pensé et fait les premiers !! :D

hum !

Publié : mar. 05/févr./2008 8:40
par Thyphoon
Dobro a écrit :
n'empêche qu'on y a pensé et fait les premiers !! :D

hum !
c'est bien connu en france on a les idées... mais apres pour les exploiter... ça se fait beaucoup mieux a l'etranger :P :wink:

Publié : mar. 01/avr./2008 22:15
par SPH
Ho, a propos, je ne sais pas si ca a été expliqué mais CONCRETEMENT,

comment executer ce code :

Code : Tout sélectionner

x=1

For i=1 To 1000
; Faire ce calcul par le core 0
x+i
; Faire ce calcul par le core 1
x+4
Next

Publié : ven. 04/avr./2008 19:05
par SPH
Donc, personne n'a de code concret pour utiliser les 2 cores ??

Publié : ven. 04/avr./2008 19:07
par Thyphoon
SPH a écrit :Donc, personne n'a de code concret pour utiliser les 2 cores ??
pose la question sur le forum anglais... je sais qu'il y a quelques codes qui traine, tu aura plus de chance d'avoir une reponse ils sont plus nombreux que sur le forum français :P
tient nous au courant

Publié : ven. 04/avr./2008 23:45
par Backup
j'ai pas repondu parceque la reponse est deja dans ce topic
9 message plus Haut Comtois donne un lien vers le forum anglais
qui donne le source d'une fonction ParallelFor()