[Code Snippet] Deux fonctions sur le processeur...

Darktib Message lu Posté le 23 Août 2008 à 18:47 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
Pour savoir le nombre de processeur et pour définir sur quel processeur s'executer. Viens du forum anglais...

Ca peut etre assez pratique avec les processeurs multi-coeurs.

Code :
`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())

print "CPU count: ",cpu_count()
print "CPU use set: ",set_affinity(%000000000000000000000010)


suspend for key


function cpu_count()
   `FOR INFO GO TO: http://msdn2.microsoft.com/en-us/library/ms686223.aspx

   for next_dll=1 to 256
      if dll exist(next_dll)=0 then exit
   next next_dll

   load dll "C:WINDOWSsystem32kernel32.dll",next_dll

   lpProcessAffinityMask=make memory(32)
   lpSystemAffinityMask=make memory(32)

   hProcess=call dll(next_dll,"GetCurrentProcess")
   get=call dll(next_dll,"GetProcessAffinityMask",hProcess,lpProcessAffinityMask,lpSystemAffinityMask)

   for cpu_count=1 to 32
      if mid$(bin$(*lpProcessAffinityMask),33-cpu_count)="0" then exit
   next cpu_count

   delete dll next_dll
   delete memory lpProcessAffinityMask
   delete memory lpSystemAffinityMask
endfunction cpu_count






function set_affinity(in)
   `FOR INFO GO TO: http://msdn2.microsoft.com/en-us/library/ms686223.aspxv

   for next_dll=1 to 256
      if dll exist(next_dll)=0 then exit
   next next_dll

   load dll "C:WINDOWSsystem32kernel32.dll",next_dll

   lpProcessAffinityMask=make memory(32)
   lpSystemAffinityMask=make memory(32)

   hProcess=call dll(next_dll,"GetCurrentProcess")
   get=call dll(next_dll,"GetProcessAffinityMask",hProcess,lpProcessAffinityMask,lpSystemAffinityMask)

   *lpProcessAffinityMask=in

   succes=call dll(next_dll,"SetProcessAffinityMask",hProcess,*lpProcessAffinityMask)

   delete dll next_dll
   delete memory lpProcessAffinityMask
   delete memory lpSystemAffinityMask
endfunction succes
Dernière édition le 10 Déc 2008 à 20:07
Mod Message lu Posté le 23 Août 2008 à 20:03 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Je n'ai jamais vraiment fouillé dans ce domaine là avec DBPro, ça peut être intéressant, même au-delà de ce langage (Win32...).

Merci pour le code !
SEB Message lu Posté le 24 Août 2008 à 11:35 Bulle
Avatar de SEB
Membre Evolué

Messages : 554
GCPoints : 103313
Comme Mod merci ca sera tres intéressant pour porter ca dans un autre language ^^
NextGine : 3D games engine
Nombre de lignes actuel : 77683
Syltech Message lu Posté le 10 Déc 2008 à 19:19 Bulle
Avatar de Syltech
Membre Confirmé

Messages : 282
GCPoints : 71266
Hum hum, ca fait un moment que j'ai étudié ses fonctions, j'avais remarqué une erreur dans la fonction cpu_count(), voici l'erreur:

Après etude de cette partie:

Code :
   for cpu_count=1 to 32
      if mid$(bin$(*lpProcessAffinityMask),cpu_count)="0" then exit
   next cpu_count
   rem dec cpu_count


J'ai remarqué que le nombre de core était simple à déterminer, enfaite la variable *lpProcessAffinityMask qui est une variable de type dword, stocke le nombre de processeur.

Sous forme binaire %00000000000000000000000000000011, je me suis aperçu que les 1 à la fin correspondent à 1 core chacun, donc 2 core dans notre exemple.

Maintenant si j'avais testé la fonction de depart avec mon phenom 4 core, je n'aurai obtenu que 2 core.

Et c'est tout a fait normal puisqu'il scanne dans une boucle For la forme binaire en commençant par la gauche... Le probleme est qu'en commençant par la gauche on a, le % qui n'est pas un 0, la boucle For continue pour ensuite trouver un 0... Et la elle s'arrete avec un nombre de core égale à 2 .

Ce qui n'est pas vrai avec mon phenom!

Donc voici ma correction:

Code :
   for cpu_count=1 to 32
      if mid$(bin$(*lpProcessAffinityMask),33-cpu_count)="0" then exit
   next cpu_count


Avec "33-cpu_count" on commence bien par la droite! :)

Syltech
Image
Darktib Message lu Posté le 10 Déc 2008 à 20:05 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
Merci pour la correction :smile: j'édite ca tout de suite.

C'est vrai que n'ayant pas de processeur a 4 coeurs chez moi je ne voyait pas le bug^^

edit : on peut aussi faire:

for t=32 to 1 step -1
Dernière édition le 10 Déc 2008 à 20:08
Syltech Message lu Posté le 10 Déc 2008 à 20:18 Bulle
Avatar de Syltech
Membre Confirmé

Messages : 282
GCPoints : 71266
Mouarf ta raison! J'ai pas l'habitude d'utiliser la commande Step...

Sinon quelqu'un aurai compris comment fonctionne le ParallelFor?

Voici un exemple sur le site devellopez.com
http://www.developpez.net/forums/d485090/autres-langages/autres-langages/basic/purebasic/parallelfor-purebasic/

J'aimerais bien utiliser mes 4 core en simultané, mais je n'ai pas encore compris comment ca fonctionne...

Syltech
Image
Darktib Message lu Posté le 10 Déc 2008 à 20:31 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
Pour utiliser 4 coeurs en simultané il te faut 4 threads.

Sur le fofo anglais il y a un code permettant de faire du threading sans plugin extérieur, faut juste que je retrouve la page et je poste le lien

En gros, tu définie l'affinité de chaque thread sur un coeur, et en théorie ca devrait fonctionner.
chaos Message lu Posté le 11 Déc 2008 à 10:18 Bulle
Avatar de chaos
Explorateur

Messages : 127
GCPoints : 11604
si ton proco est suporte l'hyperthreading tu peut utiliser 2 thread par coeur. Attention a bien gérer les mutex.
"c'est un fait, on obtient plus facilement en demandant poliment une arme a la main qu'en demandant juste poliment."
http://www.doujin-spirit.net/
gouessej Message lu Posté le 11 Déc 2008 à 10:25 Bulle
Membre Avancé

Messages : 337
GCPoints : 64624
Il y a plus simple en Java :
Runtime.getRuntime().availableProcessors()

En .NET, c'est plutôt :
System.Environment.ProcessorCount
Syltech Message lu Posté le 11 Déc 2008 à 12:44 Bulle
Avatar de Syltech
Membre Confirmé

Messages : 282
GCPoints : 71266
Ok pour les thread, j'ai trouvé la page sur le site TGC,
http://forum.thegamecreators.com/?m=forum_view&t=121503&b=6

Je vais me plongé la dedans et voir ce que je peux en tirer.
Ca serai bien de faire quelques fonctions pour utiliser plusieurs core en simultané, ca aiderait la communauté! :)
Quelqu'un à t'il reussi à le faire jusqu'a maintenant? Je n'en ai jamais entendu parler en tout cas.

Syltech

Edit: C'est sur que dans d'autres languages il est plus simple d'avoir des informations sur le processeur, apres à nous peut etre de creer la dll pour optimiser tout ca :D
Dernière édition le 11 Déc 2008 à 12:47
Image
Syltech Message lu Posté le 11 Déc 2008 à 16:24 Bulle
Avatar de Syltech
Membre Confirmé

Messages : 282
GCPoints : 71266
Bon j'ai fait plusieurs essais avec les threads...

Enfaite sur la page ou il parle des threads, l'exemple avec la commande Sync fait fonctionné le processeur double core à 100%(les threads sont gérés pas windows), mais malheureusement le Fps n'augmente pas.

Esque le faite d'utiliser les core de processeur manuellement va changé quelquechose?? la je vais devoir bossé la pour mes études, mais des se soir j'essayerai d'apporter une réponse :)

Syltech
Image
Darktib Message lu Posté le 11 Déc 2008 à 17:18 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
En fait les threads ne sont vraiment utiles que lorsqu'il y a plusieurs coeurs. Tu peux par exemple allouer un coeur pour l'IA, un pour le rendu, un pour le multijoueur, etc...
Le gain ne sera jamais de 100%, vu qu'il faut communiquer entre les threads, mais ne serait ce que 20 % serait déja tres bien.

Je pense que si tu gere bien -manuellement- les threads tu peux avoir quelques gains de performances.
Par contre si tu fait tourner le programme sur une machine uni-coeur tu va perdre des performances.

En tout cas l'idée de la dll est une bonne idée^^
chaos Message lu Posté le 11 Déc 2008 à 17:35 Bulle
Avatar de chaos
Explorateur

Messages : 127
GCPoints : 11604
@Darktib : c'est pas tout a fait vrai. Il y a pas mal de mono coeur qui supporte l'hyperthreading (pentium 4, pentium M par exemple).
"c'est un fait, on obtient plus facilement en demandant poliment une arme a la main qu'en demandant juste poliment."
http://www.doujin-spirit.net/
Syltech Message lu Posté le 12 Déc 2008 à 10:00 Bulle
Avatar de Syltech
Membre Confirmé

Messages : 282
GCPoints : 71266
Donc hier j'ai bossé dessus et malheureusement je suis bloqué, je n'arrive pas a associé un core à un thread...
J'ai beau chercher des renseignements sur les commandes de la dll Kernel32 sur le site msdn, je n'y arrive pas...

Mais je ne lâche rien, ce n'est qu'une question de temps pour trouver la solution et puis je suis pas tout seul hein ;)
Si vous avez une idée, n'hésitez pas à en parler :)

Syltech

Edit: Bon j'ai réussi à créer une fonction permettant de choisir un core pour le thread principal, j'avance trankilou :)

re_Edit: Bon j'ai pas plus avancé la :/ j'essaie de récupérer l'id de tous les threads d'un programme DarkBasic pour m'en faire une liste et pour bien les géré, j'ai vu qu'il y en avait 4-5 de base, je reprend demain après midi, demain matin j'ai examen blanc...
Dernière édition le 12 Déc 2008 à 20:38
Image
Darktib Message lu Posté le 12 Déc 2008 à 20:50 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
En effet, mais ca revient au meme : l'assignation processeur de ces commandes (et des commandes systemes en général) n'attribue que des processeurs logiques.

Par exemple, sur mon odri (Pentium D 830 - par contre je sais pas si l'hyper-threading est activée) j'ai deux processeurs physiques = 2processeurs logiques.
Sur d'autres ordinateurs, c'est par exemple 4 coeurs physiques pour 1 processeur logique.

Pour syltech, je pense qu'un tour sur le msdn pourrait résoudre ce probleme.
Je vais essayer d'y aller - mais je ne garanti rien, faut que je révise mon bac blanc^^
Syltech Message lu Posté le 12 Déc 2008 à 21:33 Bulle
Avatar de Syltech
Membre Confirmé

Messages : 282
GCPoints : 71266
hum oui Msdn, je sais, j'y passe les 3 quart de mon temps ^^ mais n'ayant pas un bon niveau en anglais ça me pose sacrément problème ^^, fait ce que tu peux pour m'aider on a le temps :)

Bonnes révisions en tout cas pour ton bac blanc ^^

La je vais posté un vieux moteur de collision 2D que j'avais fait, je pense que ça peut aidé du monde pour faire des petits jeux :)

Syltech
Image
Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.052 secondes