Déterminer la taille de mot de mon processeur
Comment puis-je déterminer la taille de mot de mon CPU? Si je comprends corriger une int
doit être un mot à droite? Je ne suis pas sûr si je suis correct.
Devrait donc juste l'impression de sizeof(int)
serait suffisant pour déterminer la taille de mot de mon processeur?
- Spécifique au système d'exploitation, ou de la croix-plate-forme?
- notez que
sizeof
renvoie un nombre de caractères, et la norme ne spécifie au moins 8 bits par caractère. - sizeof(int) fonctionne pour chaque plate-forme, j'ai travaillé sur.
- De lire les réponses, je pense qu'il y a un manque de clarté quant à ce que vous entendez par "taille de mot" -- la taille des registres, de la taille d'un autobus, et pour quelles opérations?
Vous devez vous connecter pour publier un commentaire.
Votre hypothèse sur sizeof(int) est faux; voir cette.
Car vous devez savoir que le processeur, le système d'exploitation et le compilateur au moment de la compilation, la taille de mot peut être déduit à l'aide prédéfinis architecture/OS/compilateur macros fourni par le compilateur.
Cependant, bien que simples, et la plupart des processeurs RISC, word taille, la largeur du bus, le registre de la taille et de l'organisation de la mémoire sont souvent systématiquement une valeur, cela peut ne pas être vrai au plus complexe, du CDCI et architectures DSP avec différentes tailles pour les registres virgule flottante, accumulateurs, de la largeur du bus, cache largeur, registres, etc.
Bien sûr, on peut se poser la question de savoir pourquoi vous pourriez avoir besoin de le savoir? En général, vous utilisez le type approprié de l'application, et la confiance que le compilateur pour fournir aucune optimisation. Si l'optimisation est ce que vous pensez que vous avez besoin de cette information, alors vous feriez probablement mieux à l'aide de la C99 "rapide" types. Si vous avez besoin d'optimiser un algorithme spécifique, mettre en oeuvre un certain nombre de types et de profil.
int_fast16_t
etint_fast32_t
sont à la foisint64_t
, qui n'est probablement pas un choix idéal. 32 bits est le plus rapide pour certains cas, et fait de plus petit code (moins de REX préfixes). Si jamais vous êtes de les stocker dans la mémoire, de l'esp. dans un tableau, vous ne voulez certainement pas un 64 bits type à l'aide de deux fois plus de cache.Si je comprends bien, cela dépend de la taille des données du modèle. Pour une explication pour les Systèmes UNIX, 64-bits de Données et la Taille de la Neutralité. Par exemple Linux 32-bit est ILP32, et Linux 64-bit est LP64. Je ne suis pas sûr à propos de la différence à travers des systèmes de fenêtres et de versions, d'autres que je crois que tous les 32-bits des systèmes de fenêtres sont ILP32.
Cela dépend. La version de la norme C êtes-vous de l'assumer. Quelles sont les plateformes nous parler. Est-ce une compilation ou de l'exécution de la détermination que vous essayez de faire.
Le fichier en-tête C
<limits.h>
peuvent définitWORD_BIT
et/ou__WORDSIZE
.__WORDSIZE
est de 32 dans le x86-64 Linux x32 ABI (ILP32 en 64 bits mode avec un registre d'appel ABI), donc ce n'est pas ça, non plus.__SYSCALL_WORDSIZE
est de 64 avec-mx32
et-m64
, cependant. Ce n'est pas du tout défini avec-m32
, il n'est donc pas utilisable non plus, et est probablement un Linux ou glibc-chose en particulier.sizeof(int) n'est pas toujours le "mot" de la taille de votre CPU. La question la plus importante ici est pourquoi vous voulez savoir la taille de mot.... êtes-vous essayer de faire une sorte de au moment de l'exécution et de la CPU optimisation spécifique?
Cela étant dit, sur Windows avec les processeurs Intel, la valeur nominale de la taille de mot est soit 32 ou 64 bits et vous pouvez facilement comprendre cela:
Cette réponse semble banal, mais sa véritable au premier ordre. Mais il y a certaines subtilités. Même si le x86 enregistre sur un moderne Intel ou AMD), un processeur 64-bits de large; vous ne pouvez (facilement) utilisent leurs 32 bits largeurs dans les programmes 32 bits - même si vous exécutez peut-être un système d'exploitation 64 bits. Ce sera le cas sur Linux et OSX ainsi.
Par ailleurs, sur la plupart des modernes CPU de la largeur du bus de données est plus large que le standard ALU registres EAX, EBX, ECX, etc). Ce bus de largeur peut varier, certains systèmes de 128 bits, ou même de 192 bits pour le bus.
Si vous êtes inquiet au sujet de la performance, alors vous aussi besoin de comprendre comment la L1 et de L2 les caches de données de travail. Notez que certains modernes CPU possède un cache L3. Caches, y compris une unité appelée le Tampon d'Écriture
Faire un programme qui fait une sorte de entier opération plusieurs fois, comme un entier version de la SAXPY algorithme. Courir pour différentes longueurs de mot, de 8 à 64 bits (c'est à dire à partir de
char
àlong long
).Mesurer le temps de chaque version passe lors de l'exécution de l'algorithme. Si il y a une version spécifique qui dure nettement moins que les autres, la taille de mot utilisé pour cette version est probablement le mot native de la taille de votre ordinateur. Sur l'autre voie, s'il y a plusieurs versions d'une durée de plus ou moins le même temps, ramasser celui qui a la plus grande taille de mot.
Noter que même avec cette technique, vous pouvez obtenir de fausses données: votre référence, compilé à l'aide de Turbo C et en cours d'exécution sur un processeur 80386, par le biais de DOS rapport que la taille de mot de 16 bits, tout simplement parce que le compilateur ne pas utiliser les registres 32 bits pour effectuer entier aritmetic, mais les appels à des fonctions internes qui ne la version 32 bits de chaque aritmetic opération.
a += b; b += a;
(Fibonacci) plusieurs millions de fois (avecunsigned
types, parce qu'il est overflow). Il est peu probable d'obtenir optimisé à l'écart, et ne dépend pas de la mémoire.uint16_t
vsuint32_t
vsuint64_t
vs__uint128_t
.En bref: Il n'y a pas de bonne façon. L'idée originale derrière les types de données C est que int serait la manière la plus rapide (natif) de type integer, long le plus grand etc.
Puis vint les systèmes d'exploitation qui est apparu sur un CPU et ont ensuite été porté sur différents Processeurs dont le mot de taille était différent. Pour maintenir la compatibilité du code source, certains Systèmes d'exploitation rompu avec cette définition et gardé les types de données à leurs vieilles tailles, et ajouté de nouvelles, non-standard.
Cela dit, en fonction de ce que vous avez réellement besoin, vous pourriez trouver utile de types de données dans
stdint.h
, ou le compilateur spécifique ou de la plate-forme des macros spécifiques, à des fins diverses.À utiliser au moment de la compilation:
sizeof(void*)
Ce que tous peut-être la raison pour savoir la taille du processeur, il n'a pas d'importance.
La taille du processeur est le montant de la date de Arthematic Unité Logique(ALU) d'Un Cœur de PROCESSEUR peut travailler à un seul point du temps. Un des Cœurs du PROCESSEUR de l'ALU sur Accumulateur de s'Inscrire à tout moment. Ainsi, La taille d'un PROCESSEUR de bits est la taille de l'Accumulateur s'Inscrire en bits.
Vous pouvez trouver la taille de l'accumulateur de la feuille de données du processeur ou par écrit un petit programme de langage assembleur.
Noter que l'efficacité de taille utilisable de Registre Accumulateur peut changer dans certains processeurs (comme le BRAS), basé sur le mode de fonctionnement (le Pouce et modes de BRAS). Cela signifie que la taille du processeur va également changer en fonction de la mode que de processeurs.
Il est fréquent dans de nombreuses architectures d'avoir d'adressage virtuel de la taille du pointeur et d'entier de taille même comme un accumulateur de taille. C'est seulement à profiter de l'Accumulateur s'Inscrire dans les différentes opérations du processeur, mais il n'est pas une règle absolue.
Beaucoup pense de la mémoire comme un tableau d'octets. Mais le CPU a une autre vision. Ce qui est sur la mémoire de granularité. En fonction de l'architecture, il y aurait 2, 4, 8, 16 ou même 32 octets de la mémoire de granularité. La mémoire de la granularité et l'adresse de l'alignement ont un grand impact sur les performances, la stabilité et l'exactitude de logiciel. Envisager une granularité de 4 octets, et un cas de non-alignement de la mémoire de l'accès à la lecture dans les 4 octets. Dans ce cas, chaque lecture, 75% si l'adresse est en augmentation par un octet, prend deux plus lire les instructions et de deux opérations de décalage et, enfin, un bit à bit d'instruction pour le résultat final qui est de la performance de tueur. Outre les opérations atomiques pourraient être touchés car ils doivent être indivisible. D'autres effets secondaires seraient les caches, les protocoles de synchronisation, interne de l'uc à la circulation des autobus, cpu mémoire tampon d'écriture et vous devinez quoi d'autre. Un test pratique peut être exécuté sur un tampon circulaire de voir comment les résultats pourraient être différents. Les processeurs de différents fabricants, basé sur le modèle, ont différents registres qui seront utilisés, en général, et des opérations spécifiques. Par exemple, les Processeurs modernes ont des extensions avec 128 bits des registres. Ainsi, la taille de mot n'est pas seulement sur le type d'opération, mais la mémoire de granularité. La taille de mot et l'adresse de l'alignement sont des bêtes qui doit être pris en charge sur. Il y a quelques Processeurs sur le marché qui ne prend pas soin de l'adresse de l'alignement et de simplement l'ignorer, si disponible. Et devinez ce qui arrive?