Comment déterminer la taille de mot de mon processeur? Si je comprends bien, une int
devrait être un mot Word? Je ne suis pas sûr si j'ai raison.
Donc, imprimer sizeof(int)
suffirait-il pour déterminer la taille de Word de mon processeur?
Votre hypothèse sur sizeof (int) est fausse; voir this .
Étant donné que vous devez connaître le processeur, le système d'exploitation et le compilateur au moment de la compilation, la taille de Word peut être déduite à l'aide de macros prédéfinies architecture/OS/compiler fournies par le compilateur.
Cependant, bien que la taille de Word, la largeur de bus, la taille de registre et l’organisation de la mémoire soient toujours la même valeur pour les processeurs les plus simples et RISC, il se peut que cela ne soit pas le cas pour les architectures CISC et DSP plus complexes avec des tailles différentes pour les registres à virgule flottante, les accumulateurs, la largeur de bus , largeur de cache, registres d'usage général, etc.
Bien sûr, cela soulève la question de savoir pourquoi vous pourriez avoir besoin de savoir cela? En règle générale, vous utiliseriez le type approprié à l'application et feriez confiance au compilateur pour fournir toute optimisation. Si vous pensez avoir besoin de cette information pour l'optimisation, il serait probablement préférable d'utiliser les types '= rapides' C99 . Si vous avez besoin d'optimiser un algorithme spécifique, implémentez-le pour un certain nombre de types et profilez-le.
un int devrait être un mot juste?
Si je comprends bien, cela dépend du modèle de taille des données. Pour une explication des systèmes UNIX, 64 bits et Data Size Neutrality . Par exemple, Linux 32 bits est ILP32 et Linux 64 bits est LP64. Je ne suis pas sûr de la différence entre les systèmes Windows et leurs versions, à l'exception de tous les systèmes Windows 32 bits en ILP32.
Comment déterminer la taille de mot de mon processeur?
Ça dépend. Quelle version de C standard supposez-vous? De quelles plateformes parlons-nous? Est-ce une détermination de la compilation ou de l'exécution que vous essayez de prendre?
Le fichier d'en-tête C <limits.h>
peut définir Word_BIT
et/ou __WORDSIZE
.
sizeof (int) n'est pas toujours la taille "Word" de votre CPU. La question la plus importante ici est pourquoi vous voulez connaître la taille de Word ... essayez-vous de faire une sorte d'optimisation d'exécution et de processeur spécifique?
Cela étant dit, sous Windows avec les processeurs Intel, la taille nominale de Word sera de 32 ou 64 bits et vous pouvez facilement comprendre ceci:
Cette réponse semble banale, mais elle est fidèle au premier ordre. Mais il y a quelques subtilités importantes. Même si les registres x86 sur un processeur Intel ou AMD moderne ont une largeur de 64 bits; vous pouvez seulement (facilement) utiliser leurs largeurs 32 bits dans des programmes 32 bits, même si vous utilisez un système d'exploitation 64 bits. Cela sera également vrai sous Linux et OSX.
De plus, sur la plupart des CPU modernes, la largeur du bus de données est plus large que celle des registres ALU standard (EAX, EBX, ECX, etc.). Cette largeur de bus peut varier. Certains systèmes ont des bus de 128 bits, voire de 192 bits.
Si les performances vous préoccupent, vous devez également comprendre le fonctionnement des caches de données L1 et L2. Notez que certains processeurs modernes ont un cache L3. Caches comprenant une unité appelée le tampon d’écriture
Créez un programme qui effectue plusieurs fois un type d'opération sur un entier, comme une version entière de l'algorithme SAXPY. Exécutez-le pour différentes tailles de Word, de 8 à 64 bits (c'est-à-dire de char
à long long
).
Mesurer le temps passé par chaque version lors de l'exécution de l'algorithme. Si une version spécifique dure sensiblement moins que les autres, la taille de Word utilisée pour cette version est probablement la taille native de Word de votre ordinateur. D'autre part, s'il existe plusieurs versions qui durent plus ou moins en même temps, choisissez celle qui a la plus grande taille de Word.
Notez que même avec cette technique, vous pouvez obtenir de fausses données: votre benchmark, compilé avec Turbo C et exécuté sur un processeur 80386 par DOS, indiquera que la taille de Word est de 16 bits, simplement parce que le compilateur n'utilise pas les registres 32 bits pour effectuer une aritmétique entière, mais des appels à des fonctions internes exécutant la version 32 bits de chaque opération aritmétique.
En bref: il n'y a pas de bonne façon. L'idée originale derrière les types de données C était que int serait le type entier le plus rapide (natif), long le plus gros, etc.
Viennent ensuite les systèmes d’exploitation qui proviennent d’un processeur et qui sont ensuite portés sur des processeurs dont la taille de mot native est différente. Pour maintenir la compatibilité du code source, certains des systèmes d'exploitation ont rompu avec cette définition et ont conservé les types de données à leurs anciennes tailles, en ajoutant de nouveaux types non standard.
Cela dit, selon vos besoins, vous trouverez peut-être quelques types de données utiles dans stdint.h
, ou des macros spécifiques au compilateur ou à la plate-forme à des fins diverses.
Quelle que soit la raison pour laquelle vous connaissez la taille du processeur, cela n'a pas d'importance.
La taille du processeur est la quantité de date sur laquelle l'unité de logique arthématique (ALU) d'un cœur de processeur peut fonctionner à un moment donné. L'ALU d'un cœur de processeur est inscrite sur l'accumulateur à tout moment. Ainsi, la taille de la CPU en bits est la taille du registre d'accumulateur en bits.
Vous pouvez trouver la taille de l'accumulateur à partir de la fiche technique du processeur ou en écrivant un petit programme en langage d'assemblage.
Notez que la taille utilisable effective du registre d'accumulation peut changer dans certains processeurs (comme ARM) en fonction du mode de fonctionnement (modes Thumb et ARM). Cela signifie que la taille du processeur changera également en fonction du mode de ces processeurs.
Il est courant dans de nombreuses architectures d'avoir une taille de pointeur d'adresse virtuelle et une taille entière identiques à la taille de l'accumulateur. Ce n'est que pour tirer parti du registre d'accumulateur dans différentes opérations de processeur, mais ce n'est pas une règle absolue.
A utiliser lors de la compilation: sizeof(void*)