web-dev-qa-db-fra.com

Applications 64 bits et assemblée en ligne

J'utilise Visual C++ 2010 Développer des applications Windows 32bit. Il y a quelque chose que je veux vraiment utiliser en ligne assemblée. Mais je viens de réaliser que Visual C++ ne prend pas en charge l'assemblage en ligne dans des applications 64 bits. Alors, portant à 64 bits dans le futur est un gros problème.

Je ne sais pas comment les applications 64 bits sont différentes des applications 32 bits. Existe-t-il une chance que les applications 32 bits devaient tous être améliorées à 64 bits à l'avenir? J'ai entendu dire que 64 bits cpus ont plus de registres. Étant donné que la performance n'est pas une préoccupation pour mes applications, l'utilisation de ces registres supplémentaires n'est pas une préoccupation pour moi. Y a-t-il d'autres raisons pour lesquelles une application 32 bits doit être améliorée à 64 bits? Un processus d'application de 64 bits serait-il différemment par rapport à une application 32 bits, en dehors de celle des applications 64 bits pourraient utiliser des registres ou des instructions propres à 64 bits de processeurs?

Mon application doit interagir avec d'autres composants OS par exemple. Les pilotes que je sais doivent être 64 bits dans des fenêtres 64 bits. Mon application 32bits serait-elle compatible avec eux?

27
JavaMan

Visual C++ ne prend pas en charge l'assemblage en ligne pour les processeurs x64 (ou bras) , car généralement à l'aide de l'assemblage en ligne est une mauvaise idée.

  1. Habituellement, les compilateurs produisent une meilleure assemblée que les humains.
  2. Même si vous pouvez produire une meilleure assemblée que le compilateur, l'utilisation de l'assemblage en ligne défait généralement les optimiseurs de code de tout type. Bien sûr, votre code optimisé par la main peut être plus rapide, mais le fait que le code autour de celle-ci ne puisse être optimisé conduira généralement à un programme global plus lent.
  3. COMPILER INTRINSICSSIMS SONT DISPONIBLES DU PRODUIT CHAQUE COMPILATEUR MAJEUR qui vous permet d'accéder aux fonctionnalités de la CPU avancées (par exemple, qui est cohérente avec les langues C et C++ et ne vaincent pas l'optimiseur.

Je me demande, il y aurait une chance que les applications 32 bits devaient tous être améliorées à 64 bits à l'avenir.

Cela dépend de votre public cible. Si vous ciblez des serveurs, alors oui, il est raisonnable de permettre aux utilisateurs de ne pas installer le sous-système WOW64, car c'est un serveur - vous savez que cela ne fonctionnera probablement pas trop de 32 bits. Je pense que Windows Server 2008 R2 permet déjà cela comme une option si vous l'installez comme une instance "Server Core".

Étant donné que la performance n'est pas une préoccupation pour mon Appli, l'utilisation des registres supplémentaires de 64 bits n'est pas une préoccupation pour moi. Existe-t-il d'autres raisons pour lesquelles une application 32 bits doit être améliorée à 64 bits à l'avenir?

64 bits n'a rien à voir avec des registres. Cela a à voir avec la taille de la mémoire virtuelle adressable.

Un processus d'application de 64 bits diffère-t-il d'un processus de 32 bits d'apps en dehors de celui de l'appli 64 bits utilise certains registres/instructions propres à 64 bits cpus?

Le plus probable. Les applications 32 bits sont contraintes en ce sens qu'ils ne peuvent pas mapper des choses plus d'environ 2 Go dans la mémoire à la fois. Les applications 64 bits n'ont pas ce problème. Même s'ils n'utilisent pas plus de 4 Go de mémoire physique, être capable de répondre à plus de 4 Go de mémoire virtuelle est utile pour mapper des fichiers sur disque en mémoire et similaire.

Mon application doit interagir avec d'autres composants OS par exemple. Les pilotes que je sais doivent être 64 bits dans des fenêtres 64 bits. Mon application 32bits serait-elle compatible avec eux?

Cela dépend entièrement de la façon dont vous communiquez avec ces pilotes. Si c'est à travers quelque chose comme une "interface de fichier nommée", votre application pourrait rester 32 bit. Si vous essayez de faire quelque chose comme la mémoire partagée (Yikes! Mémoire partagée accessible à partir du mode utilisateur avec un pilote?!?) Alors vous allez devoir construire votre application comme 64 bits.

16
Billy ONeal

Apart Formulaire @ Billy's Great Ecrivez, si vous ressentez vraiment la nécessité d'utiliser l'assemblage inline 64 bits, vous pouvez utiliser un assembleur externe comme MASM pour le faire faire, voir ceci . (C'est également possible d'accélérer cela avec des scripts de Prebuild).

13
Necrolis

Pendant que nous y sommes, MINGW dispose également d'une langue de montage en ligne de 64 bits; Et c'est assez rapide et libre. Il était lent sur certains mathématiques; Je commencerais donc à comparer les performances de MSVC vs. Mingw pour voir si c'est un lieu de départ décent pour votre demande.

En outre, si l'ensemble en ligne est censé ralentir le code environnant; Il me semble que tout cela pourrait être vrai pour de nombreux segments courts:

  1. En fait, les humains font très souvent l'assemblage de codes qui fonctionne plus efficacement que les compilateurs - ou du moins c'était toujours la sagesse commune lorsque j'apprendais une programmation dans les années 70 et 80 et continue d'être le cas à compter de ~ 2000.
  2. En fonction du temps passé dans les boucles et la quantité de code; Une routine d'assemblage écrite à la main pourrait accélérer une routine de manière telle que la performance perdue à l'optimisation pourrait être relativement petite; ou aucun - comme ce serait le cas pour convertir une fonction complète à l'assemblage.

L'assemblée peut avoir une place dans le code qui a besoin d'une optimisation élevée, quelle que soit la note de M $. Vous ne saurez pas vraiment si l'assemblage sera ou n'accélérera pas le code avant de l'essayer. Tout le reste est juste pontifiant.

Je suis favorable à l'approche de la compilation du code C++ dans l'assemblage, puis de la main-à-main. Cela vous sauve la peine d'en écrire une grande partie; Et avec une petite expérimentation, vous pouvez utiliser les meilleures optimisations du compilateur. puis commencer à m'améliorer à ce sujet. FWIW, je n'ai jamais eu besoin d'un programme moderne. Souvent, d'autres choses peuvent accélérer tout autant ou plus - par exemple. comme multi-threading. Cependant, pour les applications critiques de la performance, je ne vois aucune raison de ne pas essayer; et juste l'utiliser si cela fonctionne. M $ est juste en train d'être paresseux.

0
CodeLurker