|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Sep 2006
Messaggi: 13
|
[C/ASM] Ottimizzazione programma in C
Ciao ragazzi, sto ottimizzando un programma in C e pensavo di scrivere dei pezzi in assembler per velocizzarlo un po'.
Qua sotto riporto un esempio semplificato di una parte di programma: dovrei fare in pratica l'exor di due vettori che sono lunghi "symbLen" dove questo valore può essere da 1 a svariate migliaia. Se lo implementassi in Assembler avrei tutte le operazioni in parallelo (credo...) Codice:
// EX-OR COMPUTATION
for (k=0; k<symbLen; k++){
c[k] = a[k] ^ b[k];
}
Sarebbe piattaforma indipendente... |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19150
|
eh ma se deve essere piattaforma indipendente come fai a scriverlo in assembly?
ti metti a fare le #ifdef e poi codifichi in tutti gli assembly possibili tipo x86, arm, ppc, mips?? è uno sbattimento assurdo |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12113
|
Quote:
In caso positivo non potresti utilizzare dei long a 64 bit e fare l'XOR tra loro? Così anzichè ciclare fino a symblen dovresti ciclare fino a (symblen / 64 + symblen % 64) così ad occhio... ...sempre se in C è possibile fare direttamente l'XOR tra due long che sono secoli che non lo tocco.. ![]() Altrimenti vai di assembly ed SSE e utilizza i registri a 128 bit per fare direttamente queste operazioni se ne hai la necessità
__________________
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Potrebbe provare così:
Codice:
int *x, *y, *z; x = a; y = b; z = c; for (k = symbLen; k; k--) *(z++) = *(x++) ^ *(y++);
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Secondo me e' il modo corretto (e probabilmente il migliore) di ottimizzare il codice in questione. Per esserne sicuri, basta guardare il codice asm generato dal compilatore.
__________________
In God we trust; all others bring data |
|
|
|
|
|
#7 | |
|
Junior Member
Iscritto dal: Sep 2006
Messaggi: 13
|
Quote:
Ora proverò a fare un confronto fra la mia implementazione e quella suggerita da cdimauro con i puntatori per vedere quanto si guadagna... In realtà userei solo x86... l'idea del multipiattaforma cade quando si tratta di ottimizzare! Mi è stato detto che potrei usare in assebly gli SSE.... Ah, dimenticavo.... i vettori sono di char. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Se i vettori sono di char allora potresti ottenere un notevole aumento prestazionale convertendoli in int per le architetture a 32 bit e in long long per quelle a 64 bit (posto che int e long long corrispondano esattamente a queste dimensioni: il C come linguaggio non te lo garantisce
).Il codice sarebbe "qualosa" (notare le virgolette: fai delle prove e adattalo alla situazione reale) tipo questo: Codice:
MyInt *x, *y, *z; // MyInt sarà il typedef o la macro che lo definisce come int o long long a seconda dell'architettura. x = a; y = b; z = c; for (k = symbLen / sizeof(MyInt); k; k--) *(z++) = *(x++) ^ *(y++); P.S. Sì, puoi usare le SSE, ma ti legheresti alla piattaforma x86, e per di più soltanto ai processori che le hanno in dotazione.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
è un po' ot..
ma se un programma è compilato utilizzando delle sse non supportate da un processore che succede? non si avvia e basta?
__________________
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
O non si avvia o va in crash.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
ah ok.. quindi non ha un comportamento ben definito nemmeno quello!?
__________________
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Dipende dal compilatore.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
c'è anche qualcosa che non dipende dal compilatore?
![]() ironico ovviamente
__________________
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12113
|
Quote:
![]() cmq alla fine col codice del topic non ho detto una cazzata tanto grande (spero )
__________________
|
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Azz. Vero.
Non mi sono accorto che l'ultimo pezzo di codice che ho riportato praticamente è l'equivalente di quello che avevi scritto all'inizio.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12113
|
Quote:
io ormai sono allergico al C e avrei scritto sicuramente qualche cazzata
__________________
|
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Io non sono sicuro di non averne scritte, visto che pure io sono allergico al C, e da parecchio tempo.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Jul 2008
Città: Nel mio studio
Messaggi: 168
|
Dall'esperienza che ho maturato, è quasi impossibile scrivere codice più ottimizzato di un compilatore. IMHO trova una buona soluzione algoritmica e lascia perdere assembler.
__________________
Since Rocco Siffredi, the saying "pain in the ass" got a total new meaning |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Dipende dall'architettura.
P.S. Si dice "assembly", non "assembler".
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#20 |
|
Junior Member
Iscritto dal: Sep 2006
Messaggi: 13
|
Grazie ragazzi per l'aiuto che mi state dando!!
In realtà mi sto convincendo che il compilatore sa meglio di me come ottimizzare, quindi devo solo fare alcuni accorgimanti mentre scrivo. Del tipo evitare operazioni troppo complesse e non dipendenti dal ciclo for dentro gli indici di un vettore: Codice:
for (i=0; i<100; i++)
a[i] = b[i]+c[d*e+i];
Su questa scia di pensiero mi sto chiedendo come posso trovare in maniera intelligente la somma dei valori di un vettore e come trovare la cumulativa di una distribuzione di probabilità: Codice:
for (i=0; i<100; i++)
sum += a[i];
Codice:
cum[0] = dist[0];
for (i=1; i<100; i++)
cum[i] = cum[i-1] + dist[i];
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:25.













Non mi sono accorto che l'ultimo pezzo di codice che ho riportato praticamente è l'equivalente di quello che avevi scritto all'inizio.








