PB pour CPU 2 coeurs

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

estce que ça marche chez ceux qui ont plusieur core ??

ça doit retourner le nombre de Core normalement ...

Code : Tout sélectionner

Declare  cpu_count() 

Debug "CPU count: "+Str(cpu_count())


Procedure cpu_count()  
  *lpProcessAffinityMask=AllocateMemory(32) 
  *lpSystemAffinityMask= AllocateMemory(32) 
  hProcess=GetCurrentProcess_()
  get= GetProcessAffinityMask_(hProcess,*lpProcessAffinityMask,*lpSystemAffinityMask) 
  
  For cpu_count=1 To 32
    If Mid(Bin(*lpProcessAffinityMask),cpu_count,1)="0" : Break:EndIf 
  Next cpu_count
  cpu_count=  cpu_count-1 
  FreeMemory(*lpProcessAffinityMask)
  FreeMemory(*lpSystemAffinityMask)
  ProcedureReturn cpu_count
EndProcedure 

sinon estce que ceci serai une bonne traduction ?

Code : Tout sélectionner

;`USE: Read the cpu count using the function cpu_count()
;`USE: set the cpu using the function set_affinity(input) - input takes the cpu no.
;`example: USE the last cpu core only: set_affinity(cpu_count())
Declare set_affinity(in)
Declare cpu_count() 



Debug "CPU count: "+Str(cpu_count())
Debug "CPU use set: "+Str(set_affinity(%000000000000000000000001))


 
Procedure cpu_count()  
  *lpProcessAffinityMask=AllocateMemory(32) 
  *lpSystemAffinityMask= AllocateMemory(32) 
  hProcess=GetCurrentProcess_()
  get= GetProcessAffinityMask_(hProcess,*lpProcessAffinityMask,*lpSystemAffinityMask) 
  
  For cpu_count=1 To 32
    If Mid(Bin(*lpProcessAffinityMask),cpu_count,1)="0" : Break:EndIf 
  Next cpu_count
  cpu_count=  cpu_count-1 
  FreeMemory(*lpProcessAffinityMask)
  FreeMemory(*lpSystemAffinityMask)
  ProcedureReturn cpu_count
EndProcedure 
      
      
      
      
Procedure set_affinity(in)
  ;  `FOR INFO GO To: http://msdn2.microsoft.com/en-us/library/ms686223.aspxv
  
  *lpProcessAffinityMask=AllocateMemory(32) 
  *lpSystemAffinityMask= AllocateMemory(32) 
  
  hProcess=GetCurrentProcess_()
  get= GetProcessAffinityMask_(hProcess,*lpProcessAffinityMask,*lpSystemAffinityMask)  
  *lpProcessAffinityMask=in 
  succes=SetProcessAffinityMask_(hProcess,*lpProcessAffinityMask)  
  FreeMemory(*lpSystemAffinityMask)
EndProcedure
peut pas tester j'ai un P4 :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

quelqu'un essaye ? 8O
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

ça me renvoie : CPU count: 1
alors que j'ai un core 2 duo :?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Droopy a écrit :ça me renvoie : CPU count: 1
alors que j'ai un core 2 duo :?
ok merci :)

voici cette version doit mieux marcher :)


Declare cpu_count()

Debug "CPU count: " + Str (cpu_count())


Procedure cpu_count()
  *lpProcessAffinityMask= AllocateMemory (32)
  *lpSystemAffinityMask= AllocateMemory (32)
  hProcess= GetCurrentProcess_ ()
  get= GetProcessAffinityMask_ (hProcess,*lpProcessAffinityMask,*lpSystemAffinityMask)
  
   For cpu_count=1 To 32
     If Mid ( Bin (*lpProcessAffinityMask),cpu_count,1)= "0" : Break: EndIf
   Next cpu_count
  
   FreeMemory (*lpProcessAffinityMask)
   FreeMemory (*lpSystemAffinityMask)
   ProcedureReturn cpu_count
EndProcedure
Avatar de l’utilisateur
case
Messages : 1528
Inscription : lun. 10/sept./2007 11:13

Message par case »

je confirme :) ca fonctionne
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

voila j'ai fait ça sans avoir de multicore, mais vous pouvez verifier s'il vous plait ?

ce code affiche le nombre de coeur trouvé dans votre system
puis il active un coeur ici le 1 pour l'exemple , mais justement testez le 2
si vous avez un multicore ...

je lui fait faire une recherche de nombre particulier, pour occuper le processeur choisi
le but de l'algo c'est de trouver des nombre qui multiplié par eux-meme donne un nombre qui ce termine par le fameux nombre...
ex : 6x6=36
ou bien
9376x9376=97909376

algo corrigé !! :D

apres je ne sait pas si vous avez un moyen de controler quel CPU fonctionne ? :)

testez moi ça donc :



  ;`USE: Read the cpu count using the function cpu_count()
;`USE: set the cpu using the function set_affinity(input) - input takes the cpu no.
;`example: USE the last cpu core only: set_affinity(cpu_count())
Declare set_affinity(in)
Declare cpu_count()
l.d=2


Debug "CPU count: " + Str (cpu_count())
; on choisi un processeur pour travailler !!
Debug "CPU use set: " + Str (set_affinity(1)) ; set_affinity(numero du processeur choisi pour travailler )



;****************************** calcul pour occuper le processeur choisi *****************
; Code par Dobro
Resultat = OpenConsole ()

debut:
a.q=a.q+1
ConsoleTitle ( Str (a.q))
b.s= Str (a.q&255)
long= Len (b.s)
If Val ( Right ( Str (a.q*a.q),long))=a.q
   Print ( Str (a.q))
   Print ( " Multiplie par " )
   Print ( Str (a.q))
   Print ( " = " )
   Print ( Str (a.q*a.q))
   PrintN ( "" )
EndIf
Delay (1)
Goto debut

; ****************************************************************************************



 
Procedure cpu_count() ; procedure qui compte les "cores " present ...
  *lpProcessAffinityMask= AllocateMemory (32)
  *lpSystemAffinityMask= AllocateMemory (32)
  hProcess= GetCurrentProcess_ ()
  get= GetProcessAffinityMask_ (hProcess,*lpProcessAffinityMask,*lpSystemAffinityMask)
  
   For cpu_count=1 To 32
     If Mid ( Bin (*lpProcessAffinityMask),cpu_count,1)= "0" : Break: EndIf
   Next cpu_count
  
   FreeMemory (*lpProcessAffinityMask)
   FreeMemory (*lpSystemAffinityMask)
   ProcedureReturn cpu_count
EndProcedure
     
     
     
     
Procedure set_affinity(in)
   ; `FOR INFO GO To: http://msdn2.microsoft.com/en-us/library/ms686223.aspxv
  
  *lpProcessAffinityMask= AllocateMemory (32)
  *lpSystemAffinityMask= AllocateMemory (32)
  
  hProcess= GetCurrentProcess_ ()
  get= GetProcessAffinityMask_ (hProcess,*lpProcessAffinityMask,*lpSystemAffinityMask)
  *lpProcessAffinityMask=in
  succes= SetProcessAffinityMask_ (hProcess,*lpProcessAffinityMask)
  
   ProcedureReturn succes
  
   FreeMemory (*lpSystemAffinityMask)
  
EndProcedure
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

C'est bon il renvoie 2 CPU
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Merci pour vos code, j'adore faire mumuse avec les ressource hardware :P
(Ca ma déjà valu quelque TRES beaux plantages lol :lol: )
Avatar de l’utilisateur
Eric
Messages : 79
Inscription : dim. 08/juil./2007 21:38
Localisation : Nord
Contact :

Message par Eric »

Chez moi, cela retourne 2 alors que j'en ai 4.


Eric
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Eric a écrit :Chez moi, cela retourne 2 alors que j'en ai 4.


Eric
vous avez , l'Api a vous de chercher, moi j'ai pas de multicore, je ne peux poursuivre plus loin ...
Avatar de l’utilisateur
Eric
Messages : 79
Inscription : dim. 08/juil./2007 21:38
Localisation : Nord
Contact :

Message par Eric »

Ok, désolé
Je vais cherché ...

Cdt,
Eric
Avatar de l’utilisateur
Jacobus
Messages : 1520
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Pour connaître rapidement le nombre de processeurs disponibles, il y a les variables d'environnement, direct en PB

Code : Tout sélectionner

Procedure NbCores()
If ExamineEnvironmentVariables()  
  While NextEnvironmentVariable()
    If EnvironmentVariableName() = "NUMBER_OF_PROCESSORS"
     Valeur = Val(EnvironmentVariableValue())
     ProcedureReturn Valeur
    EndIf
  Wend 
EndIf 
EndProcedure

Debug NbCores()
Si vous avez du dual core, le gestionnaire des tâches montre les 2 au travail dans l'onglet "Performances", enfin chez moi ça marche.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Eric
Messages : 79
Inscription : dim. 08/juil./2007 21:38
Localisation : Nord
Contact :

Message par Eric »

Bien vu, cela marche impec

merci

Eric
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message par Gillou »

Je pense que le code de base PowerBasic avait une légère erreur qui s'est poursuivi dans la conversion et sans pouvoir tester sur son pc impossible à voir ;)

donc pour la commande CPU_COUNT je la remplacerai plutot par GETAFFINITY

CF Code suivant provenant de msdn:

Code : Tout sélectionner

Dim idThread As Long
   Dim idProcess As Long
   Dim ProcessAffinity As Long
   Dim SystemAffinity As Long
   Dim lRet As Long
   Dim hProcess As Long

   idProcess = Shell("C:\Program Files\Microsoft" & _
      " Office\Office\MSACCESS.EXE" & _
      " C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb", _
      vbMaximizedFocus)

   If idProcess Then
      hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or _
         PROCESS_SET_INFORMATION, False, idProcess)
      lRet = GetProcessAffinityMask(hProcess, ProcessAffinity, _
         SystemAffinity)
      ProcessAffinity = 1 ' this sets the process to only run on CPU 0
                          ' for CPU 1 only use 2 and for CPUs 1 & 2 use 3
      lRet = SetProcessAffinityMask(hProcess, ProcessAffinity)
      CloseHandle (hProcess)
   End If


Procedure GetAffinity(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
    
     ; Définition d'après MSDN (Traduction...)
     ; Le lpSystemAffinityMask correspond au numéro du ou des processeurs utilisables par le processus
     ; Le lpProcessAffinityMask correspond au numéro du ou des processeurs dont il est affilié (Le process est un sous-ensmble du system)
     ; D'après mes tests la plupart des processus ont le même numéro
    
     ; Valeur de retour de la commande :
     ; Si on a un dual core
     ; 1 = CPU 0
     ; 2 = CPU 1
     ; 3 = CPU 0+1
    
EndProcedure
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message par Gillou »

Ensuite le commande CPU_COUNT, par ce code
Structure SYSTEM_BASIC_INFORMATION
    reserved.l
    TimerResolution.l
    PageSize.l
    NumberOfPhysicalPages.l
    LowestPhysicalPageNumber.l
    HighestPhysicalPageNumber.l
    AllocationGranularity.l
    MinimumUserModeAddress.l
    MaximumUserModeAddress.l
    ActiveProcessorsAffinityMask.l
    NumberOfProcessors.l
EndStructure

#SystemBasicInformation = 0
#SystemProcessorPerformanceInformation = 8
#SysProcPerfInfoLength = 48

ProcedureDLL.l cpu_count() ; Retourne le nombre de processeur
    Protected resultat, Lib, SBI.SYSTEM_BASIC_INFORMATION
    Lib = OpenLibrary ( #PB_Any , "ntdll.dll" )
     If Lib
         If CallFunction (Lib, "NtQuerySystemInformation" , #SystemBasicInformation , @SBI, SizeOf (SYSTEM_BASIC_INFORMATION), 0) = 0
            resultat = SBI\NumberOfProcessors
         EndIf
         CloseLibrary (Lib)
     EndIf
     ProcedureReturn resultat
EndProcedure



OU en plus court
ProcedureDLL.l cpu_count() ; Retourne le nombre de processeur
    Protected SI.SYSTEM_INFO
     GetSystemInfo_ (@SI)
     ProcedureReturn SI\dwNumberOfProcessors
EndProcedure
Répondre