Determinar el tamaño de palabra de mi procesador

9 minutos de lectura

avatar de usuario
usuario69514

¿Cómo determino el tamaño de palabra de mi CPU? Si entiendo corregir un int debería ser una palabra ¿no? No estoy seguro si estoy en lo correcto.

Así que solo debería imprimir sizeof(int) sería suficiente para determinar el tamaño de palabra de mi procesador?

  • ¿Específico del sistema operativo o multiplataforma?

    – Chris H.

    20 de febrero de 2010 a las 4:17

  • tenga en cuenta que sizeof devuelve una cantidad de caracteres, y el estándar solo especifica por lo menos 8 bits por carácter.

    – Pascal Cuoq

    20 de febrero de 2010 a las 10:31

  • sizeof(int) funciona para todas las plataformas en las que he trabajado.

    -Kenny

    20 de febrero de 2010 a las 12:01

  • Al leer las respuestas, creo que falta claridad en cuanto a lo que quiere decir con “tamaño de palabra”: tamaño de los registros, tamaño del bus y para qué operaciones.

    – Sorén

    13 de mayo de 2016 a las 1:21

avatar de usuario
clifford

Su suposición sobre sizeof(int) no es cierta; ver esta.

Dado que debe conocer el procesador, el sistema operativo y el compilador en el momento de la compilación, el tamaño de la palabra se puede inferir utilizando predefinidos macros de arquitectura/SO/compilador proporcionada por el compilador.

Sin embargo, mientras que en los procesadores más simples y en la mayoría de los RISC, el tamaño de palabra, el ancho del bus, el tamaño del registro y la organización de la memoria son a menudo un valor consistente, esto puede no ser cierto para las arquitecturas CISC y DSP más complejas con varios tamaños para registros de punto flotante, acumuladores, ancho del bus. , ancho de caché, registros de propósito general, etc.

Por supuesto, surge la pregunta de por qué es posible que necesite saber esto. En general, usaría el tipo apropiado para la aplicación y confiaría en que el compilador proporcione cualquier optimización. Si la optimización es para lo que cree que necesita esta información, entonces probablemente sería mejor que usara el C99 tipos ‘rápidos’. Si necesita optimizar un algoritmo específico, impleméntelo para varios tipos y perfílelo.

  • ¡Arreglé los enlaces rotos/incorrectos si alguien estaba confundido antes!

    – Clifford

    20 de febrero de 2010 a las 17:54

  • En Linux x86-64, int_fast16_t y int_fast32_t son ambos int64_t, que probablemente no sea una opción ideal. 32 bits es el más rápido para algunos casos y crea un código más pequeño (menos prefijos REX). Si alguna vez los almacena en la memoria, esp. en una matriz, definitivamente no desea un tipo de 64 bits que use el doble de caché.

    – Peter Cordes

    13 de mayo de 2016 a las 3:04


  • @PeterCordes: De acuerdo: las palabras ‘generalmente’ y ‘probablemente’ se usaron deliberadamente en la respuesta. Al igual que con cualquier ‘optimización manual’, debe probarse y compararse con la solución sencilla. Lástima que el OP no eligió aclarar su necesidad de saber, o hacer la X a esta pregunta Y.

    – Clifford

    13 de mayo de 2016 a las 5:57


un int debe ser una palabra, ¿verdad?

Según tengo entendido, eso depende del modelo de tamaño de datos. Para obtener una explicación de los sistemas UNIX, 64 bits y neutralidad del tamaño de los datos. Por ejemplo, Linux de 32 bits es ILP32 y Linux de 64 bits es LP64. No estoy seguro de la diferencia entre los sistemas y versiones de Windows, aparte de que creo que todos los sistemas de Windows de 32 bits son ILP32.

¿Cómo determino el tamaño de palabra de mi CPU?

Eso depende. ¿Qué versión del estándar C está asumiendo? ¿De qué plataformas estamos hablando? ¿Es esta una determinación de compilación o tiempo de ejecución que está tratando de hacer?

El archivo de encabezado C <limits.h> puede definir WORD_BIT y/o __WORDSIZE.

  • Estas cosas están determinadas por el compilador y no tienen una relación directa con el tamaño real (ancho) del tamaño de palabra de la CPU. Dicho de otra manera, estas cosas están definidas por el desarrollador del compilador, no determinadas por las características físicas de la propia CPU.

    – proa

    23 de febrero de 2010 a las 3:07

  • Como un entorno de compilador cruzado, cierto. Debería haber aclarado que si alguien quiere escribir código que sea consciente del tamaño de palabra de su objetivo host, pueden usar algo como el archivo de encabezado limites.h.

    – mctylr

    23 de febrero de 2010 a las 14:53

  • Por supuesto, esto es para el entorno de destino, no para el capacidades de la CPU de destino. Como cualquier último modelo x86 de Intel o AMD, que se puede usar como un procesador de 32 o 64 bits. Según el sistema operativo que se ejecute, la CPU se puede utilizar como un procesador de 32 o de 64 bits. En el modo de 32 bits, no se puede acceder a los registros como de 64 bits (8 bytes) palabra registros, aunque la CPU tiene registros de 64 bits.

    – mctylr

    23 de febrero de 2010 a las 15:05

  • __WORDSIZE es 32 en el x86-64 Linux x32 ABI (ILP32 en modo de 64 bits con un ABI de llamada de registro), así que tampoco es eso. __SYSCALL_WORDSIZE es 64 con -mx32 y -m64, aunque. No está definido en absoluto con -m32por lo que tampoco se puede usar, y probablemente sea algo específico de Linux o glibc.

    – Peter Cordes

    13 de mayo de 2016 a las 2:45

avatar de usuario
proa

sizeof(int) no siempre es el tamaño de “palabra” de su CPU. La pregunta más importante aquí es por qué quieres saber el tamaño de la palabra… ¿estás tratando de hacer algún tipo de optimización específica del tiempo de ejecución y de la CPU?

Dicho esto, en Windows con procesadores Intel, el tamaño de palabra nominal será de 32 o 64 bits y puede averiguarlo fácilmente:

  • si su programa está compilado para 32 bits, entonces el tamaño de palabra nominal es de 32 bits
  • si ha compilado un programa de 64 bits, entonces el tamaño de palabra nominal es de 64 bits.

Esta respuesta suena trillada, pero es fiel al primer orden. Pero hay algunas sutilezas importantes. Aunque los registros x86 en un procesador Intel o AMD moderno tienen un ancho de 64 bits; solo puede (fácilmente) usar sus anchos de 32 bits en programas de 32 bits, aunque esté ejecutando un sistema operativo de 64 bits. Esto también será cierto en Linux y OSX.

Además, en la mayoría de las CPU modernas, el ancho del bus de datos es más ancho que los registros ALU estándar (EAX, EBX, ECX, etc.). Este ancho de bus puede variar, algunos sistemas tienen buses de 128 bits o incluso de 192 bits de ancho.

Si le preocupa el rendimiento, también debe comprender cómo funcionan las cachés de datos L1 y L2. Tenga en cuenta que algunas CPU modernas tienen un caché L3. Cachés que incluyen una unidad llamada Write Buffer

  • ¿No se hace sizeof(int) en tiempo de compilación, lo que significa que es el tamaño para el que se compila, no el tamaño de la computadora que lo está ejecutando?

    – FryGuy

    20 de febrero de 2010 a las 20:13

  • El código x86 de 32 bits literalmente no puede usar los registros de 64 bits de ancho completo. No hay prefijo de tamaño de operando ni nada. Además, ¿está seguro de las rutas de datos de 192 bits de ancho en cualquier CPU? Eso suena como el ancho del bus de memoria en una GPU. Intel pasó de 128b rutas de L1 a unidades de ejecución a 256b (en Haswell, publicado años después de que se escribiera esta respuesta).

    – Peter Cordes

    13 de mayo de 2016 a las 2:49

Cree un programa que realice algún tipo de operación con enteros muchas veces, como una versión entera del algoritmo SAXPY. Ejecútelo para diferentes tamaños de palabras, de 8 a 64 bits (es decir, de char para long long).

Mida el tiempo que pasa cada versión mientras ejecuta el algoritmo. Si hay una versión específica que dura notablemente menos que las demás, el tamaño de palabra utilizado para esa versión es probablemente el tamaño de palabra nativo de su computadora. Por el contrario, si hay varias versiones que duran más o menos lo mismo, elige la que tenga mayor tamaño de palabra.

Tenga en cuenta que incluso con esta técnica puede obtener datos falsos: su punto de referencia, compilado con Turbo C y ejecutándose en un procesador 80386 a través de DOS, informará que el tamaño de la palabra es de 16 bits, solo porque el compilador no usa los registros de 32 bits. para realizar aritmética de enteros, sino llamadas a funciones internas que realizan la versión de 32 bits de cada operación aritmética.

avatar de usuario
ario abraham

“Además, la el tamaño del tipo C long es igual al tamaño de la palabra, mientras que el tamaño del tipo int a veces es menor que el tamaño de la palabra. Por ejemplo, Alpha tiene un tamaño de palabra de 64 bits. En consecuencia, los registros, los punteros y el tipo largo tienen una longitud de 64 bits”.

fuente: http://books.msspace.net/mirrorbooks/kerneldevelopment/0672327201/ch19lev1sec2.html

Teniendo esto en cuenta, se puede ejecutar el siguiente programa para averiguar el tamaño de palabra de la máquina en la que está trabajando:

#include <stdio.h>

int main ()

{

    long l;
    
    short s = (8 * sizeof(l));
    
    printf("Word size of this machine is %hi bits\n", s);
    
    return 0;
}

avatar de usuario
ulitestigo

En resumen: no hay una buena manera. La idea original detrás de los tipos de datos C era que int sería el tipo entero más rápido (nativo), long el más grande, etc.

Luego vinieron los sistemas operativos que se originaron en una CPU y luego se trasladaron a diferentes CPU cuyo tamaño de palabra nativo era diferente. Para mantener la compatibilidad del código fuente, algunos de los sistemas operativos rompieron con esa definición y mantuvieron los tipos de datos en sus tamaños anteriores y agregaron otros nuevos no estándar.

Dicho esto, dependiendo de lo que realmente necesite, puede encontrar algunos tipos de datos útiles en stdint.ho macros específicas del compilador o de la plataforma para varios propósitos.

avatar de usuario
Miguel

Para usar en tiempo de compilación: sizeof(void*)

  • Esto no es correcto en plataformas como 360 y PS3, que son de 64 bits, pero los punteros son de 32 bits (peculiaridad de ABI para ahorrar espacio).

    – Maestro

    29 de julio de 2012 a las 9:37


  • Eso daría al tamaño de un puntero, que es algo diferente

    – Sorén

    13 de mayo de 2016 a las 1:15

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad