[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [OT]: cicli in assembler



Stefano Simonucci wrote:

> Nel tentativo di ottimizzare un programmino al massimo grado mi sono
> imbattuto nell' assembler 
Non vorrei scoraggiarti, ma normalmente i compilatori producono codice più
ottimizzato di quello prodotto a mano dalla maggior parte dei programmatori
assembly con esperienza. Inoltre la regola generale è che le ottimizzazioni
non si fanno. Per gli esperti, le ottimizzazioni si fanno poi. Se hai
problemi di prestazioni normalmente è meglio agire sugli algoritmi
piuttosto che sulle ottimizzazioni.

> Il registro rax e' inizializzato a 1
> .L2:
>         movsd   a.1246+8(,%rax,8), %xmm0
>         mulsd   %xmm0, %xmm0
>         movsd   %xmm0, b.1245+8(,%rax,8)
>         addq    $1, %rax
>         cmpq    $9999999, %rax
>         jne     .L2
> 
> se cambio la riga    "addq    $1, %rax"
> con   la riga        "addq    $2, %rax"
> Dovrei eseguire il ciclo solo la meta' delle volte rispetto al caso
> precedente. Il tempo di esecuzione tuttavia rimane invariato (0.19
> sec).
> Se pero' tolgo le istruzioni movsd e mulsd cambiando
> "addq    $1, %rax"
> con
> "addq    $2, %rax"
> il tempo si dimezza.
Non conosco bene l'assembly x86-64 (e nemmeno altri assembly per quel che
conta), ma sei sicuro che il registro rax non venga modificato da una delle
due movsd? Oppure che il numero di bytes copiato dalle movsd non dipenda
dal valore di rax?

> Inoltre se tolgo solo mulsd (ossia la moltiplicazione) il tempo rimane
> di circa (0.19sec).
Appunto. Questo continua a farmi pensare che il valore di rax dipenda da una
delle mov. Oppure che una delle due movsd ci metta il doppio del tempo
quando rax viene incrementato di due (però non ricordo bene se questo sia
possibile nel caso della movsd, dato che non ricordo se sia un'istruzione
condizionale o no).

> Qualcuno sa indicarmi la causa oppure dove potrei reperire informazioni
> al riguardo? Dalle ricerche fatte con google non sono riuscito a trovare
> il numero di cicli di clock per ogni istruzione.
Quale che sia il numero di cicli di clock delle istruzioni, mi verrebbe da
pensare che questo numero di cicli di clock sia costante, tranne per la
movsd che deve copiare stringhe di numeri, ma qui ricadiamo nell'ipotesi
che ho fatto sopra. Comunque mi sembra che le tue movsd, se interpreto bene
la sintassi, copino sempre 32 bytes indipendentemente dal valore di rax,
quindi possiamo considerare costante il numero di cicli di clock anche per
loro (ma ci sarebbero ancora da fare considerazioni sulla cache L1 ed L2).
Se i cicli di clock sono sempre gli stessi come penso, indipendentemente da
quanti sono, non possono spiegare i risultati che ottieni.

Per curiosità, cosa dovrebbe fare in concreto questo ciclo?

Lucio.



Reply to: