PB pour CPU 2 coeurs

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Merci de t'etre mis a la tache !! cela me servira dans le futur, lorsque j'aurai un multicore !! :)
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message par Gillou »

Pas de pb, c'est un forum d'entraide non ;)

Par contre si certains pouvaient tester :D
Avatar de l’utilisateur
Eric
Messages : 79
Inscription : dim. 08/juil./2007 21:38
Localisation : Nord
Contact :

Message par Eric »

Cela fonctionne nikel. avec Quad 6600

Un grand merci aux pro du forum

Eric
Avatar de l’utilisateur
SPH
Messages : 4945
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Ca fonctionne aussi sur un proc E4500 (intel 2 core)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Ca donne quoi en fr ? lol

C'est pour travailler sur les différent core dispo ?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Ha ouai quand même ! 8O
Ca peut booster nos jeux amateurs n'empêche !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 !
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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:
Avatar de l’utilisateur
SPH
Messages : 4945
Inscription : mer. 09/nov./2005 9:53

Message 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
Avatar de l’utilisateur
SPH
Messages : 4945
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Donc, personne n'a de code concret pour utiliser les 2 cores ??
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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()
Répondre