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 ?

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=3
6
ou bien
9376x9376=9790
9376
algo corrigé !!
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
(Ca ma déjà valu quelque TRES beaux plantages 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