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 grands, de sorte que les programmes seront probablement plus grands. Et le désir d’allouer de la mémoire sur les limites des mots pour plus d’efficacité signifierait plus d’espace blanc entre les allocations.
J'ai aussi entendu dire que le mode 32 bits sur le x86 doit vider son cache en cas de changement de contexte en raison du chevauchement possible des espaces d'adresses 4G.
Alors, quels sont les avantages réels de 64 bits?
Et comme question supplémentaire, est-ce que 128 bits serait encore mieux?
Modifier:
Je viens d'écrire mon premier programme 32/64 bits. Il crée des listes/arbres liés d'objets de 16 octets (version 32b) ou de 32 octets (version 64b) et effectue beaucoup d'impression sur stderr - ce n'est pas un programme vraiment utile, ni quelque chose de typique, mais c'est mon premier.
Taille: 81128 (32b) v 83672 (64b) - donc pas beaucoup de différence
Vitesse: 17s (32b) v 24s (64b) - fonctionnant sous un système d'exploitation 32 bits (OS-X 10.5.8)
Mettre à jour:
Je remarque qu’un nouvel hybride x32 ABI (interface binaire d’application) est en cours de développement, à savoir 64 bits, mais utilise des pointeurs 32 bits. Pour certains tests, il en résulte un code plus petit et une exécution plus rapide que 32b ou 64b.
À moins que vous n'ayez besoin d'accéder à plus de mémoire que l'adressage 32b vous permettra, les avantages seront faibles, voire inexistants.
Lorsque vous utilisez un processeur 64b, vous obtenez la même interface de mémoire, que vous exécutiez du code 32b ou 64b (vous utilisez le même cache et le même BUS).
Bien que l'architecture x64 comporte un peu plus de registres, ce qui facilite l'optimisation, ce qui est souvent contrecarré par le fait que les pointeurs sont maintenant plus grands et que l'utilisation de structures comportant des pointeurs entraîne un trafic mémoire plus important. J’estimerais que l’augmentation de l’utilisation globale de la mémoire pour une application 64b par rapport à une application 32b se situe autour de 15-30%.
Je constate généralement une amélioration de 30% de la vitesse pour le code intensif en calcul sous x86-64 par rapport à x86. Cela est probablement dû au fait que nous avons des registres à usage général 16 x 64 bits et 16 registres SSE au lieu de 8 registres à usage général 32 bits et de 8 registres SSE. C’est avec le compilateur Intel ICC (11.1) sur un Linux x86-64 - 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.
Quels que soient les avantages, je vous conseillerais de toujours compiler votre programme pour la taille de mot par défaut du système (32 bits ou 64 bits), car si vous compilez une bibliothèque en tant que fichier binaire 32 bits et que vous la fournissez sur un ordinateur 64 bits système, vous obligerez tous ceux qui souhaitent créer un lien avec votre bibliothèque à fournir leur bibliothèque (et toutes les dépendances de la bibliothèque) sous forme de fichier binaire 32 bits, lorsque la version 64 bits est la version 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 espace d'adressage plus important. Par conséquent, si vous créez un fichier mappé, vous pouvez en traiter plusieurs en même temps (et charger des fichiers plus volumineux en mémoire). Un autre avantage est que, en supposant que le compilateur optimise bien la plupart de vos opérations arithmétiques, vous pouvez les mettre en parallèle (par exemple, en plaçant deux paires de nombres 32 bits dans deux registres et en effectuant deux ajouts en une seule opération), et les calculs de nombres se dérouleront plus rapidement. Cela dit, la solution 64 bits/32 bits ne vous aidera pas du tout à la complexité asymptotique. Par conséquent, si vous souhaitez optimiser votre code, vous devriez probablement consulter les algorithmes plutôt que les facteurs constants comme celui-ci.
MODIFIER:
S'il vous plaît ne pas tenir compte de ma déclaration sur l'addition parallélisée. 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 le grand espace d’adresses, réside dans le fait qu’il existe plus de registres à usage général, ce qui signifie que davantage de variables locales peuvent être gérées dans le fichier de registre de la CPU, ce qui est beaucoup plus rapide d’accès que si vous placez les variables dans le répertoire. pile de programmes (ce qui signifie généralement aller dans le cache L1).
En plus d'avoir plus de registres, SSE2 64 bits est par défaut. Cela signifie que vous pouvez effectivement effectuer des calculs en parallèle. Les extensions SSE comportaient également d'autres avantages. Mais je suppose que le principal avantage est de ne pas avoir à vérifier la présence des extensions. Si c'est x64, il a SSE2 disponible. ... Si ma mémoire me sert correctement.
Seule la justification du déplacement de votre application en 64 bits nécessite davantage 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 où la limite de 2 Go sera dépassée assez rapidement lorsque les applications mettent en cache des performances optimales. C'est particulièrement le cas sur les systèmes d'exploitation Windows où l'entier et le long sont toujours de 32 bits (ils ont la nouvelle variable _int64. Seuls les pointeurs sont de 64 bits. En fait, WOW64 est hautement optimisé sur Windows x64, de sorte que les applications 32 bits s'exécutent avec une pénalité faible sur Windows 64 bits. Mon expérience sous Windows x64 est que la version de l’application 32 bits est exécutée 10 à 15% plus vite que 64 bits, car dans les cas précédents, au moins pour les bases de données à mémoire propriétaire, vous pouvez utiliser un pointeur arithmatique pour la maintenance du b-tree (partie la plus intensive du processeur dans les systèmes de base de données). Les applications gourmandes en ressources qui nécessitent des décimales élevées pour une précision optimale que ne permet pas le double sur un système d'exploitation 32-64 bits. Ces applications peuvent utiliser _int64 de manière native au lieu de l'émulation logicielle. Bien sûr, les bases de données volumineuses présenteront également une amélioration par rapport à 32 bits à la capacité d'utiliser une grande mémoire pour la mise en cache des plans de requête, etc.
Dans le cas spécifique de x68 à x68_64, le programme 64 bits aura à peu près la même taille, s'il n'est pas légèrement plus petit, utilisera un peu plus de mémoire et s'exécutera plus rapidement. Cela est principalement dû au fait que x86_64 n'a pas que des registres 64 bits, il en a aussi deux fois plus. x86 ne dispose pas de suffisamment de registres pour rendre les langages compilés aussi efficaces qu'ils le pourraient. Le code x86 utilise donc beaucoup d'instructions et de bande passante mémoire pour transférer les données entre les registres et la mémoire. x86_64 a beaucoup moins de cela, donc cela prend un peu moins d'espace et est plus rapide. Les instructions de virgule flottante et de vecteur à tordre sont également beaucoup plus efficaces dans x86_64.
En général, cependant, le code 64 bits n’est pas nécessairement plus rapide et est généralement plus volumineux, tant pour l’utilisation du code que pour la mémoire au moment de l’exécution.
Davantage de données sont transférées entre la CPU et RAM à chaque extraction de mémoire (64 bits au lieu de 32), ce qui permet aux programmes 64 bits d’être plus rapides à condition qu’ils soient écrits pour en tirer profit.
Je code un moteur d'échecs. La meilleure extraction par déplacement utilisant une recherche dans l’arborescence basée sur le minimax jusqu’à la profondeur 9 (à partir d’une certaine position) prenait environ 17,0 s sur la configuration Win32 et, après le passage à x64, prend désormais environ 10,3 s. C'est 41% d'accélération!
Toutes les applications nécessitant une utilisation du processeur, telles que le transcodage, les performances d'affichage et le rendu des supports, qu'ils soient audio ou visuels, nécessiteront certainement (à ce stade) et bénéficieront de l'utilisation de 64 bits par rapport à 32 bits en raison de la capacité du processeur à gérer le quantité de données jetées dessus. Ce n'est pas tant une question d'espace d'adressage que c'est la manière dont les données sont traitées. Un processeur 64 bits, avec un code 64 bits, fonctionnera mieux, en particulier avec des tâches mathématiques difficiles telles que le transcodage et les données VoIP - en fait, toute sorte d’applications «mathématiques» devrait bénéficier de l’utilisation de processeurs et de systèmes d’exploitation 64 bits. Prouve moi le contraire.