Page 2 sur 3

Publié : dim. 23/déc./2007 16:53
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 :)

Publié : dim. 23/déc./2007 19:25
par Backup
quelqu'un essaye ? 8O

Publié : dim. 23/déc./2007 21:14
par Droopy
ça me renvoie : CPU count: 1
alors que j'ai un core 2 duo :?

Publié : dim. 23/déc./2007 22:55
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

Publié : dim. 23/déc./2007 23:10
par case
je confirme :) ca fonctionne

Publié : dim. 23/déc./2007 23:21
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

Publié : lun. 24/déc./2007 10:16
par Droopy
C'est bon il renvoie 2 CPU

Publié : lun. 24/déc./2007 12:02
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: )

Publié : dim. 30/déc./2007 23:54
par Eric
Chez moi, cela retourne 2 alors que j'en ai 4.


Eric

Publié : lun. 31/déc./2007 0:21
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 ...

Publié : lun. 31/déc./2007 0:30
par Eric
Ok, désolé
Je vais cherché ...

Cdt,
Eric

Publié : lun. 31/déc./2007 8:54
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.

Publié : lun. 31/déc./2007 8:56
par Eric
Bien vu, cela marche impec

merci

Eric

Publié : dim. 20/janv./2008 2:09
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

Publié : dim. 20/janv./2008 2:14
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