Question

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 si les programmes sont susceptibles d'être plus grande. Et le désir d'allouer de la mémoire sur les limites de mots pour l'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 lorsque le changement de contexte en raison des espaces d'adressage 4G possibles qui se chevauchent.

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

Et comme une question supplémentaire serait de 128 bits encore mieux?

Edit:

Je viens d'écrire mon premier programme 32/64 bits. Il fait listes chaînées / arbres de 16 octets (version 32b) ou des objets 32 octets (64b version) et fait beaucoup d'impression à stderr - pas un programme vraiment utile, et non quelque chose de typique, mais il est mon premier

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

Vitesse: 17s (32b) 24s v (64b) - en cours d'exécution sur 32 bits Système d'exploitation (OS-X 10.5.8)

Mise à jour:

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

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

Était-ce utile?

La solution

Sauf si vous avez besoin d'accéder à plus de mémoire que 32b adressage vous permettra, les avantages seront petits, le cas échéant.

Lors de l'exécution sur 64b CPU, vous obtenez la même interface de mémoire, peu importe si vous exécutez 32b ou code 64b (vous utilisez le même cache et même BUS).

Alors que l'architecture x64 a quelques autres registres qui permet des optimisations plus facile, ce qui est souvent contrecarrée par les pointeurs de fait sont maintenant plus grandes et en utilisant des structures avec des pointeurs entraîne un trafic de mémoire supérieure. J'estimer l'augmentation de l'utilisation de la mémoire globale pour une application 64b par rapport à un 32b l'un à l'ordre de 15-30%.

Autres conseils

Je vois généralement une amélioration de la vitesse de 30% pour le code de calcul intensif sur x86-64 par rapport à x86. Ceci est probablement dû au fait que nous avons 16 x 64 bits registres à usage général et 16 x SSE registres au lieu de 8 x 32 bits registres à usage général et 8 x 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), peut être différent bien sûr

Quelles que soient les avantages, je suggère que vous avez toujours compilez votre programme pour la taille de texte par défaut du système (32 bits ou 64 bits), car si vous compilez une bibliothèque en tant que binaire 32 bits et fournissez sur un système 64 bits, vous forcera tous ceux qui veulent faire le lien avec votre bibliothèque pour fournir leur bibliothèque (et toutes les autres dépendances de la bibliothèque) en tant que binaire 32 bits, lorsque la version 64 bits est la valeur par défaut disponible. Cela peut être une nuisance tout à fait pour tout le monde. En cas de doute, fournir les deux versions de votre bibliothèque.

En ce qui concerne les avantages pratiques de 64 bits ... la plus évidente est que vous obtenez un plus grand espace d'adressage, donc si mmap un fichier, vous pouvez vous adresser plus de celui-ci à la fois (et charger des fichiers plus volumineux en mémoire). Un autre avantage est que, en supposant que le compilateur fait un bon travail d'optimisation, plusieurs de vos opérations arithmétiques peuvent être parallélisés (par exemple, en plaçant deux paires de nombres 32 bits dans deux registres et effectuer deux ajoute en fonctionnement simple add) et grand calculs numériques fonctionneront plus rapidement. Cela dit, l'ensemble 64 bits vs 32 bits chose que vous ne contribuera pas à la complexité asymptotique du tout, donc si vous cherchez à optimiser votre code, vous devriez probablement se pencher sur les algorithmes plutôt que les facteurs constants comme celui-ci.

EDIT :
S'il vous plaît ne pas tenir compte de ma déclaration au sujet de l'ajout parallélisée. Ce n'est pas effectuée par une instruction add ordinaire ... Je confonds que certaines des instructions vectorisés / SSE. Un avantage plus précis, en dehors de l'espace d'adressage plus grande, est qu'il existe des registres d'usage plus général, ce qui signifie plus variables locales peuvent être maintenues dans le fichier de registre du processeur, ce qui est beaucoup plus rapide d'accès, que si vous placez les variables du pile de programme (ce qui signifie généralement sortir le cache L1).

En plus d'avoir plusieurs registres, 64-bit a SSE2 par défaut. Cela signifie que vous pouvez en effet effectuer des calculs en parallèle. Les extensions SSE avaient d'autres goodies aussi. 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 ne me trompe pas.

justification uniquement pour déplacer votre application à 64 bits est nécessaire pour plus de mémoire dans des applications telles que les grandes bases de données ou applications ERP avec au moins 100s d'utilisateurs simultanés où la limite de 2 Go sera dépassé assez rapidement lorsque le cache des applications pour une meilleure performance. Ceci est le cas spécialement sous Windows OS où nombre entier et long est encore 32 bits (ils ont une nouvelle _int64 variable. Seuls des pointeurs sont 64 bits. En fait WOW64 est optimisé sur Windows 64 bits afin que les applications 32 bits fonctionnent avec pénalité faible sur Windows 64 bits OS. Mon expérience sur Windows 64 bits est de 32 bits version exécutable 10-15% plus rapide que 64 bits d'application puisque dans l'ancien cas au moins pour les bases de données de mémoire propriétaires, vous pouvez utiliser un pointeur arithmatic pour maintenir b-arbre (processeur le plus une partie intensive des systèmes de bases de données) . Compuatation applications intensives nécessitant de grandes décimales pour une précision maximale n'ACCORDER en double sur le système d'exploitation peu 32-64. Ces applications peuvent utiliser _int64 en mode natif au lieu d'émulation logicielle. bases de données sur Bien sûr, un grand disque aussi montrer une amélioration de plus de 32 bits simplement en raison à la capacité d'utiliser une grande mémoire pour la mise en cache des plans de requête et ainsi de suite.

Plus les données sont transférées entre la CPU et RAM pour chaque mémoire fetch (64 bits au lieu de 32), afin que les programmes 64 bits peuvent être plus rapides à condition qu'ils soient écrits afin qu'ils prennent bien parti.

Dans le cas particulier de x68 à x68_64, le programme 64 bits sera de la même taille, sinon un peu plus petite, utilisez un peu plus de mémoire, et courir plus vite. La plupart du temps c'est parce que x86_64 n'a pas seulement 64 registres de bits, il a aussi deux fois plus nombreux. x86 n'a pas assez de registres pour rendre les langages compilés aussi efficaces qu'ils pourraient être, si le code x86 passe beaucoup d'instructions et de données de décalage de bande passante mémoire et-vient entre les registres et la mémoire. x86_64 a beaucoup moins de cela, et il faut un peu moins d'espace et est plus rapide. Flottant instructions vectorielles et points bit bidouilles sont également beaucoup plus efficace dans x86_64.

En général, cependant, 64 bit code n'est pas forcément plus rapide, et est généralement plus grande, à la fois pour le code et l'utilisation de la mémoire lors de l'exécution.

Les applications qui nécessitent l'utilisation du processeur, comme le transcodage, les performances d'affichage et les médias rendu, que ce soit audio ou visuel, certainement besoin (à ce stade) et bénéficier de l'aide de 64 bits contre 32 bits en raison de la capacité du CPU à traiter avec l'énorme quantité de données jeté à elle. Ce n'est pas tant une question d'espace d'adressage car il est la façon dont les données sont traitées. Un processeur 64 bits, étant donné 64 bit code, va mieux fonctionner, surtout avec des choses mathématiquement difficiles comme transcoder et les données VoIP - en fait, toute sorte d'applications « mathématiques » devrait bénéficier de l'utilisation de 64 processeurs bits et les systèmes d'exploitation. Prouvez-moi mal.

Je suis le codage d'un moteur d'échecs. La meilleure extraction de déplacement en utilisant une recherche d'arbre à base Minimax à la profondeur 9 (à partir d'une certaine position) a ~ 17.0s sur la configuration Win32 et après le passage à x64 prend maintenant ~ 10.3s. Ceci est 41% de l'accélération!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top