CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet : Optimiser une VM

DébutPage précedente
12
Page suivanteFin
pierre135b pierre135b
MP
Niveau 10
02 octobre 2015 à 22:21:02

Bonjour,
Quand je code une petite vm, comment l'optimiser pour qu'elle exécute le plus d'instruction par seconde, mais dans le bon ordre ?
Dois-je répartir la gestion dans des thread ? SI oui combien de thread créer, et à quel fréquence les faires fonctionner ? Et aussi comment faire en sorte qu'ils restent synchrone (que la ligne 1 ne soit pas exécutée apres la 2 par exemple ^^)

Sinon, quel fréquence max puis-je viser (nombre d'itération de la simulation du cycle du processeur (Execution d'un Opcode) faire par seconde sur une machine "normale" (on va dire sur un i5 par exemple, même si ici j'ai un i7 4790l))

Et plus généralement, comment la rendre la plus rapide possible (bon pas un truc pro 2 la mor ki tue nn plu :hap: )

Mercii

godrik godrik
MP
Niveau 22
02 octobre 2015 à 22:37:46

De quoi parles tu?

pierre135b pierre135b
MP
Niveau 10
02 octobre 2015 à 22:40:28

En gros, j'ai une machine virtuelle simple, j'aimerais qu'elle éxécute le plus d'opcode par seconde.
Donc, quelle est la meilleure approche

  • Multithreadé les cycles du CPU
  • Ne faire qu'une seule boucle principale

Donc je cherche a simuler la plus grosse fréquence possible de CPU, tout simplement.

godrik godrik
MP
Niveau 22
02 octobre 2015 à 23:37:07

oula, c'est complique comme question.
Parallelise un langage de bas niveau est essentiellement impossible. Les instructions d'un programme ont typiquement trop de dependance pour etre parallelise efficacement.
Ne faire qu'une seule boucle principale n'est pas une description bien clair. La question est combien de cycle de ton processeur il va te falloir pour emuler un cycle de la machine virtuelle. Et probablement ca depend des instructions.
Ce qui est souvent fait par les langages qui tournent sur des machines virtuelle est d'avoir une API standard qui soit implemente directement en C et pas en assembleur de la machine virtuelle.
Sinon ce que tu peux aussi faire, c'est exposer dans l'assembleur de ta machine virtuelle, des instructions qui s'executent efficacement sur ton architecture cible. Par exemple, matlab expose des notations tableau et matrices qui sont execute avec un appel a un lib blas.
Ce qui est aussi possible, c'est de cacher le resultat parsing d'instructions en langage intermediaire. Par exemple, tu peux peut-etre compiler du code specifique pour les fonctions communement utilise par un programme qui tourne sur la machine virtuelle. Ou encore, stocker une representation intermediaire.

pierre135b pierre135b
MP
Niveau 10
03 octobre 2015 à 17:32:40

Ce que je fais déja, c'est que l'entiereté du programme est chargée en mémoire déja.
Mais je veux simuler autant de cycle par seconde que possible (1mhz = 1 000 000 cycles par seconde? Ce serait possible?)

godrik godrik
MP
Niveau 22
03 octobre 2015 à 17:48:07

Ca depend de la complexite des operations, de combien de memoire ta machine virtuelle a. Mais 1Mhz n'a pas l'air difficile a emuler.

Note qu'emuler une frequence en particulier est plus difficile que d'emuler une machine pour aller aussi vite que possible.

Message édité le 03 octobre 2015 à 17:48:44 par godrik
pierre135b pierre135b
MP
Niveau 10
03 octobre 2015 à 18:51:48

Bah 1Mhz c'est 1 million de boucles par secondes il me semble, cela n'est pas dur ?

godrik godrik
MP
Niveau 22
03 octobre 2015 à 19:02:15

Ton processeur est probablement a 2Ghz, donc il fait 2 milliard de cycle par seconde. Alors si tu fais une instruction virtuelle en moins de 2000 cycles de ton processeur, alors ca va bien se passer.

Message édité le 03 octobre 2015 à 19:02:33 par godrik
pierre135b pierre135b
MP
Niveau 10
03 octobre 2015 à 19:10:35

Mon processeur est un i7 4790k Cadencé à 4Ghz (+- 4.4 en turbo)

Mais le soucis, comment je code cela en gardant une fréquence voulue ,car si en C++ je fais une boucle toute simple, elle ne va pas s'exécuter plusieur millions de foiis par seconde

Message édité le 03 octobre 2015 à 19:14:23 par pierre135b
godrik godrik
MP
Niveau 22
03 octobre 2015 à 19:14:50

ca depend de ce que fais ta boucle.
Une boucle toute simple genre:
for(int i=0; i< n; ++i)
sum += i;
Ca devrait s'executer a en gros 1-2 milliard de boucle par seconde.

pierre135b pierre135b
MP
Niveau 10
03 octobre 2015 à 19:21:01

Ouai mais ça c'est pas possible vu qu'a chaque cycle je dois fetch,decode,execute l'opcode ^^
Y'a pas moyen d'utiliser tout les coeurs du proc pour rendre la boucle plus rapide sans trop bouffer le proc ?

La JVM fait comment par exemple?

godrik godrik
MP
Niveau 22
03 octobre 2015 à 19:26:14

la JVM compile le bytecode en code natif.

Non, ce n'est pas possible d'utiliser plusieurs coeur pour faire ca a ce niveau la. La synchro entre les threads est trop couteuse pour pouvoir faire un pipeline fetch/decode/execute avec different core.

pierre135b pierre135b
MP
Niveau 10
03 octobre 2015 à 19:40:58

Je parle de la Java virtual machine, c'est une machine virtuelle non ? Donc elle émule des cycles de processeur si je me trompes pas, combien en fait-elle par seconde?

godrik godrik
MP
Niveau 22
03 octobre 2015 à 19:50:38

oui c'est une machine virtuelle. Mais souvent elle compile le bytecode en code natif pour eviter tous les surcout possible. Du fait, si tu fais purement de l'arithmetique le surcout de la JVM est tres faible.

pierre135b pierre135b
MP
Niveau 10
03 octobre 2015 à 19:52:43

Donc en gros, chaque Opcode de la JVM équivaut à un bout de code en assembleur, qu'elle compile juste à temps pour le programme?

godrik godrik
MP
Niveau 22
03 octobre 2015 à 19:56:25

la compilation se fait typiquement par fonction. chaque fonction est compilee pour faire la meme chose qu'une execution naive ferait.

pierre135b pierre135b
MP
Niveau 10
03 octobre 2015 à 19:57:12

Donc, si j'ai compri :
La JVM rencontre cela :
bipush_5
Elle va convertir ça en assembleur illico et l'envoyer au proco?

godrik godrik
MP
Niveau 22
03 octobre 2015 à 19:58:57

non. Elle va faire ca par fonction. probablement pas pas instruction.

pierre135b pierre135b
MP
Niveau 10
03 octobre 2015 à 19:59:44

Ah d'accord, je pense comprendre, elle convertis des bouts de codes entier (genre la fonction, comme tu dis) en assembleur pour l'utiliser à la demande ?

Comment elle décide quoi convertir et quoi exécuter directement?

godrik godrik
MP
Niveau 22
03 octobre 2015 à 20:01:31

Precisement, je ne sais pas. Mais elle fait probablement un peu de stat sur les fonctions. Si elle une fonction est appeller souvent alors elle est compile. sinon elle est interpretee.

DébutPage précedente
12
Page suivanteFin
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment