Les programmes 64 bits sont-ils plus gros et plus rapides que les versions 32 bits?

Je suppose que je me concentre sur x86, mais je suis généralement intéressé par le passage de 32 à 64 bits.

Logiquement, je peux voir que les constantes et les pointeurs, dans certains cas, seront plus importants, de sorte que les programmes risquent d’être plus grands. Et le désir d’allouer de la mémoire aux limites de mots pour des raisons d’efficacité signifierait plus d’espace blanc entre les allocations.

J’ai également entendu que le mode 32 bits sur le x86 doit vider son cache lors de la commutation de contexte en raison d’un chevauchement possible des espaces d’adressage 4G.

Alors, quels sont les avantages réels de 64 bits?

Et à titre de question complémentaire, 128 bits serait-il encore meilleur?

Modifier:

Je viens d’écrire mon premier programme 32/64 bits. Il crée des listes / arborescences liées aux objects de 16 octets (version 32b) ou 32 octets (version 64b) et fait beaucoup d’impression sur stderr – ce n’est pas un programme très utile, et pas quelque chose de typique, mais c’est mon premier.

Taille: 81128 (32b) v 83672 (64b) – donc pas beaucoup de différence

Vitesse: 17 s (32b) v 24s (64b) – fonctionnant sur un système d’exploitation 32 bits (OS-X 10.5.8)

Mettre à jour:

Je note qu’un nouvel hybride x32 ABI (Application Binary Interface) est en cours de développement, qui est 64b mais utilise des pointeurs 32b. Pour certains tests, il en résulte un code plus petit et une exécution plus rapide que 32b ou 64b.

https://sites.google.com/site/x32abi/

À moins que vous n’ayez besoin d’accéder à plus de mémoire que l’adressage 32b vous permettra, les avantages seront minimes, le cas échéant.

Si vous utilisez un processeur 64b, vous obtenez la même interface mémoire, que vous utilisiez le code 32b ou 64b (vous utilisez le même cache et le même bus).

Alors que l’architecture x64 dispose de quelques registres supplémentaires permettant des optimisations plus simples, cela est souvent contrecarré par le fait que les pointeurs sont désormais plus volumineux et que l’utilisation de structures avec des pointeurs entraîne un trafic de mémoire plus important. Je voudrais estimer l’augmentation de l’utilisation globale de la mémoire pour une application 64b comparée à celle de 32b autour de 15-30%.

Je vois généralement une amélioration de la vitesse de 30% pour le code intensif en calcul sur x86-64 par rapport à x86. Cela est probablement dû au fait que nous avons 16 registres 64 bits et 16 registres SSE au lieu de 8 registres 32 bits et 8 registres SSE. Ceci est avec le compilateur Intel ICC (11.1) sur un x86-64 Linux – les résultats avec d’autres compilateurs (par exemple, gcc), ou avec d’autres systèmes d’exploitation (par exemple Windows), peuvent bien sûr être différents.

Indépendamment des avantages, je suggère que vous compiliez toujours votre programme pour la taille de mot par défaut du système (32 bits ou 64 bits), car si vous comstackz une bibliothèque en tant que binary 32 bits et que vous la fournissez sur un 64 bits system, vous forcerez toute personne souhaitant créer un lien avec votre bibliothèque à fournir leur bibliothèque (et toute autre dépendance à la bibliothèque) en tant que fichier binary 32 bits, lorsque la version 64 bits est disponible par défaut. Cela peut être une nuisance pour tout le monde. En cas de doute, fournissez les deux versions de votre bibliothèque.

En ce qui concerne les avantages pratiques du 64 bits … le plus évident est que vous obtenez un plus grand espace d’adresse, donc si vous mappez un fichier, vous pouvez en traiter plus en même temps (et charger des fichiers plus volumineux en mémoire). Un autre avantage est que, en supposant que le compilateur effectue un bon travail d’optimisation, beaucoup de vos opérations arithmétiques peuvent être parallélisées (par exemple, placer deux paires de nombres de 32 bits dans deux registres et effectuer deux ajouts dans une opération d’addition unique). les calculs de nombres se dérouleront plus rapidement. Cela dit, toute la complexité de la version 64 bits vs 32 bits ne vous aidera pas du tout, alors si vous cherchez à optimiser votre code, vous devriez probablement regarder les algorithmes plutôt que les facteurs constants comme celui-ci.

EDIT :
Veuillez ne pas tenir compte de ma déclaration concernant l’ajout parallélisé. Ceci n’est pas effectué par une instruction add ordinaire … Je confondais cela avec certaines instructions vectorisées / SSE. Un avantage plus précis, mis à part l’espace d’adressage plus important, est qu’il y a des registres plus généraux, ce qui signifie que plus de variables locales peuvent être conservées dans le fichier de registre du processeur, ce qui est beaucoup plus rapide. programme stack (qui signifie généralement sortir dans le cache L1).

En plus d’avoir plus de registres, le 64 bits a SSE2 par défaut. Cela signifie que vous pouvez effectivement effectuer certains calculs en parallèle. Les extensions SSE ont également eu d’autres goodies. Mais je suppose que le principal avantage est de ne pas avoir à vérifier la présence des extensions. Si c’est x64, SSE2 est disponible. … Si ma mémoire me sert correctement.

Dans le cas spécifique de x68 à x68_64, le programme 64 bits aura à peu près la même taille, sinon légèrement plus petit, utilisera un peu plus de mémoire et fonctionnera plus rapidement. La plupart du temps, c’est parce que x86_64 n’a pas que des registres 64 bits, mais deux fois plus. x86 ne dispose pas de suffisamment de registres pour rendre les langages compilés aussi efficaces qu’ils pourraient l’être. Le code x86 consacre donc beaucoup d’instructions et de données de décalage de bande passante entre les registres et la mémoire. x86_64 en a beaucoup moins, et cela prend donc un peu moins d’espace et s’exécute plus rapidement. Les instructions vectorielles en virgule flottante et en twidding sont également beaucoup plus efficaces dans x86_64.

En général, le code 64 bits n’est pas nécessairement plus rapide et est généralement plus volumineux, à la fois pour le code et pour l’utilisation de la mémoire lors de l’exécution.

Seule la justification de la migration de votre application en 64 bits nécessite plus de mémoire dans des applications telles que des bases de données volumineuses ou des applications ERP avec au moins 100 utilisateurs simultanés. C’est particulièrement le cas sur les systèmes d’exploitation Windows où les entiers et les longs sont toujours 32 bits (ils ont une nouvelle variable _int64. Seuls les pointeurs sont 64 bits. En fait, WOW64 est hautement optimisé sur Windows x64; Mon expérience sur Windows x64 est une version d’application 32 bits plus rapide que 64 bits, car dans les anciens cas, au moins pour les bases de données propriétaires, vous pouvez utiliser l’arithmatique des pointeurs pour gérer les b-tree Les applications intensives en calcul nécessitant des décimales importantes pour une précision maximale que n’atteint pas le double sur un système d’exploitation 32-64 bits. Ces applications peuvent utiliser _int64 en mode natif au lieu d’une émulation logicielle. à la capacité d’utiliser de la grande mémoire pour la mise en cache des plans de requête et ainsi de suite.

Plus de données sont transférées entre le CPU et la RAM pour chaque extraction de mémoire (64 bits au lieu de 32), de sorte que les programmes 64 bits peuvent être plus rapides à condition qu’ils soient écrits de manière à en tirer le meilleur parti.

Toutes les applications nécessitant un processeur telles que le transcodage, les performances d’affichage et le rendu multimédia, qu’elles soient audio ou visuelles, auront certainement besoin (à ce stade) d’utiliser 64 bits contre 32 bits en raison de la capacité du processeur à gérer quantité de données en cours de projection. Ce n’est pas tant une question d’espace d’adressage que de traitement des données. Un processeur 64 bits, avec un code 64 bits, fonctionnera mieux, en particulier avec les choses mathématiquement difficiles comme le transcodage et les données VoIP. En fait, toute application “mathématique” devrait bénéficier de processeurs et de systèmes d’exploitation 64 bits. Prouve moi le contraire.