GameCorp - Index des forumsGame MakingProgrammationDark Basic - DarkGDK[Code Snippet] Deux fonctions sur le processeur...
[Code Snippet] Deux fonctions sur le processeur...
| Darktib |
Posté le 23 Août 2008 à 18:47
|
|
![]() 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 |
Posté le 23 Août 2008 à 20:03
|
|
![]() 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 |
Posté le 24 Août 2008 à 11:35
|
|
![]() 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 |
Posté le 10 Déc 2008 à 19:19
|
|
![]() 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 ![]() |
|
| Darktib |
Posté le 10 Déc 2008 à 20:05
|
|
![]() Messages : 4017 GCPoints : 347288 |
Merci pour la correction 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 |
Posté le 10 Déc 2008 à 20:18
|
|
![]() 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 ![]() |
|
| Darktib |
Posté le 10 Déc 2008 à 20:31
|
|
![]() 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 |
Posté le 11 Déc 2008 à 10:18
|
|
![]() 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 |
Posté le 11 Déc 2008 à 10:25
|
|
![]() Messages : 337 GCPoints : 64624 |
Il y a plus simple en Java : Runtime.getRuntime().availableProcessors() En .NET, c'est plutôt : System.Environment.ProcessorCount |
|
| Syltech |
Posté le 11 Déc 2008 à 12:44
|
|
![]() 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
![]() |
|
| Syltech |
Posté le 11 Déc 2008 à 16:24
|
|
![]() 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 ![]() |
|
| Darktib |
Posté le 11 Déc 2008 à 17:18
|
|
![]() 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 |
Posté le 11 Déc 2008 à 17:35
|
|
![]() 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 |
Posté le 12 Déc 2008 à 10:00
|
|
![]() 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
![]() |
|
| Darktib |
Posté le 12 Déc 2008 à 20:50
|
|
![]() 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 |
Posté le 12 Déc 2008 à 21:33
|
|
![]() 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 ![]() |
|
GameCorp - Index des forumsGame MakingProgrammationDark Basic - DarkGDK[Code Snippet] Deux fonctions sur le processeur...
Répondre






