PDA

View Full Version : [ASM x86] Dove trovo il numero di cicli usati da ogni istruzione?


AnonimoVeneziano
14-01-2005, 14:48
Ciao ,

ho ripreso in mano l'asm dopo un po' e mi sto divertendo a farci un po' di cose dietro :P

Però mi chiedo una cosa .Vedo molti di voi che fanno il calcolo di quanti clicli di clock verranno utilizzati dal processore per fare una certa operazione , ma dove si trovano tabelle che indicano su un processore x86 standard quanti cicli di clock ci vogliono per eseguire una data istruzione??

Grazie

Ciao

dupa
14-01-2005, 15:15
Originariamente inviato da AnonimoVeneziano
Ciao ,

ho ripreso in mano l'asm dopo un po' e mi sto divertendo a farci un po' di cose dietro :P

Però mi chiedo una cosa .Vedo molti di voi che fanno il calcolo di quanti clicli di clock verranno utilizzati dal processore per fare una certa operazione , ma dove si trovano tabelle che indicano su un processore x86 standard quanti cicli di clock ci vogliono per eseguire una data istruzione??

Grazie

Ciao

credo esistano delle specifiche fornite da intel o amd, cerca sui loro siti

dupa
14-01-2005, 15:16
dimenticavo di dirti che esistono anche tecniche di pipelining, quindi se stai cercando di scrivere codice superottimizzato devi considerare anche quegli aspetti

cionci
14-01-2005, 18:50
Originariamente inviato da dupa
dimenticavo di dirti che esistono anche tecniche di pipelining, quindi se stai cercando di scrivere codice superottimizzato devi considerare anche quegli aspetti
Infatti...inoltre la durata varia da architettura ad architettura...

VICIUS
14-01-2005, 19:04
Quando spaciugavo con hashing e crittografia mi ero scritto delle macro che usavano l'istruzione rdtsc per calcolare il numero esatto di cicli di clock che venivano usati. se vuoi posso provare a ritrovarle.

ciao ;)

AnonimoVeneziano
14-01-2005, 20:02
Ok, boys

Scusate per la risposta tarda ma oggi dovevo studiare sodo :p

Comunque grazie infinite per le info :)

Se vic riesci a trovare quelle macro potrebbero sempre rivelarsi moooolto utili :D

(comunque ho trovato la documentazione AMD relativa all' athlon, il mio procio )

Una domanda però mi sorge . Infondo al PDF dove c'è la tabella delle istruzioni e i vari cicli di clock usati le varie istruzioni sono differenziate per operatori e ho visto che ci sono operatori tipo "reg8" ,"reg16" ... e poi operatori tipo "mreg8", "mreg16" ....

Andando a vedere la differenza tra i due nel PDF ho visto questo :

reg8 byte integer register defined by instruction byte(s) or bits 5, 4, and 3 of the modR/M byte

mreg8 byte integer register defined by bits 2, 1, and 0 of the modR/M byte

reg16/32 word and doubleword integer register defined by instruction byte(s) or bits 5, 4, and 3 of the modR/M byte

mreg16/32 word and doubleword integer register defined by bits 2, 1, and 0 of the modR/M byte


Non ho capito bene la differenza, e neanche che cavolo è modR/M. Penso di aver capito che centra con la conversione della Mnemonic e dei suoi operatori nel relativo OPcode, ma non ho trovato info specifiche su cosa sia, ma solo sulla sua applicazione (info che richiedono una conoscienza implicita di che sia) .

Se qualcuno mi può illuminare ...;)



Ciao

VICIUS
14-01-2005, 20:20
Posto qui il codice, potrebbe servire anche ad altri.
/* Conta il numero di clock impiegati dalla cpu per eseguire tutte
* le istruzioni tra due punti. */
#include <stdio.h>
#include <inttypes.h>
static inline long long rdtsc(void)
{
long long l;
asm volatile("rdtsc\n\t"
: "=A" (l)
);
return l;
}

#define rdtsc_start()\
uint64_t start;\
uint64_t end;\
start = rdtsc ()

#define rdtsc_stop(name)\
end = rdtsc ();\
{\
uint64_t tot = 0;\
tot = end - start;\
fprintf (stdout, "%Ld cicli in %s\n", tot, name);\
}

int main (int argc, char **argv)
{

int k;

for (k = 0; k<10; k++){
rdtsc_start();

int i;
for (i = 0; i < 100; i++)
{
double a = log2 (i);
}

rdtsc_stop ("main");

}

return 0;
}

ciao ;)

cionci
15-01-2005, 00:29
Originariamente inviato da AnonimoVeneziano
Non ho capito bene la differenza, e neanche che cavolo è modR/M. Penso di aver capito che centra con la conversione della Mnemonic e dei suoi operatori nel relativo OPcode, ma non ho trovato info specifiche su cosa sia, ma solo sulla sua applicazione (info che richiedono una conoscienza implicita di che sia) .

In pratica modR/M è un campo dell'opcode che contiene informazioni relative allle direzione e modalità di trasferimento dati dell'istruzione...