half - 1 word informatica



Determina la dimensione della parola del mio processore (5)

un int dovrebbe essere una parola giusta?

A quanto ho capito, ciò dipende dal modello delle dimensioni dei dati. Per una spiegazione dei sistemi UNIX, 64 bit e Neutralità della dimensione dei dati . Ad esempio, Linux 32-bit è ILP32 e Linux 64-bit è LP64. Non sono sicuro della differenza tra i sistemi e le versioni di Windows, a parte il fatto che tutti i sistemi Window a 32 bit sono ILP32.

Come posso determinare la dimensione della parola della mia CPU?

Dipende. Quale versione dello standard C stai assumendo. Di quali piattaforme stiamo parlando. È una determinazione del tempo di compilazione o di esecuzione che stai cercando di fare.

Il file di intestazione C <limits.h> può definire WORD_BIT e / o __WORDSIZE .

https://src-bin.com

Come posso determinare la dimensione della parola della mia CPU? Se ho capito bene, un int dovrebbe essere una parola giusta? Non sono sicuro se sono corretto.

Quindi, basterà stampare solo sizeof(int) per determinare la dimensione della parola del mio processore?


Answer #1

Crea un programma che faccia un qualche tipo di operazione numero intero molte volte, come una versione intera dell'algoritmo SAXPY. Eseguilo per diverse dimensioni di parola, da 8 a 64 bit (cioè da char a long long ).

Misura il tempo trascorso da ciascuna versione durante l'esecuzione dell'algoritmo. Se esiste una versione specifica che dura sensibilmente meno delle altre, la dimensione della parola utilizzata per quella versione è probabilmente la dimensione nativa del tuo computer. D'altra parte, se ci sono diverse versioni che durano più o meno allo stesso tempo, prendi quella che ha la maggiore dimensione della parola.

Si noti che anche con questa tecnica è possibile ottenere dati falsi: il benchmark, compilato utilizzando Turbo C e in esecuzione su un processore 80386 tramite DOS, segnala che la dimensione della parola è di 16 bit, solo perché il compilatore non utilizza i registri a 32 bit per eseguire l'aritmetico intero, ma chiama le funzioni interne che eseguono la versione a 32 bit di ciascuna operazione aritmetica.


Answer #2

In breve: non esiste un modo valido. L'idea originale alla base dei tipi di dati C era che int sarebbe il tipo integer (nativo) più veloce, lungo il più grande ecc.

Poi sono arrivati ​​i sistemi operativi che hanno avuto origine su una CPU e sono stati quindi portati su diverse CPU la cui dimensione nativa era diversa. Per mantenere la compatibilità del codice sorgente, alcuni sistemi operativi hanno rotto con quella definizione e hanno mantenuto i tipi di dati alle loro vecchie dimensioni e aggiunto nuovi, non standard.

Detto questo, a seconda di ciò che realmente ti serve, potresti trovare alcuni tipi di dati utili in stdint.h , o macro specifiche del compilatore o specifiche della piattaforma per vari scopi.


Answer #3

La tua ipotesi su sizeof (int) non è vera; vedi this

Poiché è necessario conoscere il processore, il sistema operativo e il compilatore in fase di compilazione, la dimensione della parola può essere dedotta utilizzando le macro predefinite di architettura / OS / compilatore fornite dal compilatore.

Tuttavia, mentre su processori più semplici e più RISC, la dimensione della parola, la larghezza del bus, la dimensione del registro e l'organizzazione della memoria sono spesso un valore, questo potrebbe non essere vero per architetture CISC e DSP più complesse con varie dimensioni per registri in virgola mobile, accumulatori, larghezza del bus , larghezza della cache, registri generali, ecc.

Ovviamente si pone la domanda perché potrebbe essere necessario saperlo? Generalmente si usa il tipo appropriato per l'applicazione e si ha fiducia nel compilatore per fornire qualsiasi ottimizzazione. Se l'ottimizzazione è ciò per cui ritieni di aver bisogno di queste informazioni, probabilmente staresti meglio usando i tipi 'veloci' di C99 . Se è necessario ottimizzare un algoritmo specifico, implementarlo per un numero di tipi e profilarlo.


Answer #4

sizeof (int) non è sempre la dimensione della "parola" della tua CPU. La domanda più importante qui è perché vuoi conoscere la dimensione della parola .... stai provando a fare qualche tipo di ottimizzazione della CPU in fase di esecuzione?

Detto questo, su Windows con processori Intel, la dimensione nominale della parola sarà 32 o 64 bit e si può facilmente capire questo:

  • se il tuo programma è compilato per 32-bit, allora la dimensione nominale della parola è 32-bit
  • se hai compilato un programma a 64-bit allora la dimensione nominale della parola è 64-bit.

Questa risposta suona banale, ma è vera al primo ordine. Ma ci sono alcune sottigliezze importanti. Anche se i registri x86 su un moderno processore Intel o AMD hanno una larghezza di 64 bit; puoi solo (facilmente) usare le loro larghezze di 32 bit nei programmi a 32 bit, anche se potresti avere un sistema operativo a 64 bit. Questo sarà vero anche su Linux e OSX.

Inoltre, nella maggior parte delle moderne CPU la larghezza del bus dati è più ampia dei registri ALU standard (EAX, EBX, ECX, ecc.). Questa larghezza del bus può variare, alcuni sistemi hanno bus a 128 bit o addirittura a 192 bit.

Se sei preoccupato per le prestazioni, devi anche capire come funzionano le cache dei dati L1 e L2. Si noti che alcune CPU moderne hanno una cache L3. Cache inclusa un'unità chiamata Buffer di scrittura





word-size