Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air combina diverse carte molto interessanti: un OLED PaperMatte da 12 pollici, un corpo sottile e una tastiera molto comoda. Durante la prova abbiamo apprezzato fluidità, audio e comfort visivo, mentre i test hanno chiarito pregi e qualche limite nelle prestazioni. L'autonomia ha convinto anche nell'uso intermittente; la scelta passa dalla compatibilità delle proprie app e dal valore del pacchetto con accessori, proposto a 749 euro
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
Debuttano ufficialmente i primi sistemi notebook basati su piattaforma NVIDIA RTX Spark, abbinati a Windows on ARM e pensati per l'intelligenza artificiale agentica. Architettura integrata tra CPU e GPU che condividono la memoria di sistema, capace di gestire in locale modelli molto grandi ma al contempo anche di spiccare con la grafica e l'elaborazione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Abbiamo provato Motorola razr fold, il pieghevole a libro con display interno LTPO da 8,09 pollici, Snapdragon 8 Gen 5 e batteria da 6000 mAh in 243 grammi. Pennino e custodia sopno già nella confezione, per un foldable che si caratterizza per il pannello luminoso, l'autonomia ottima per la categoria e le fotocamere coerenti e ben sfruttabili. Il listino è di 1999 euro, ma in vendita si trova già a molto meno
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-07-2008, 09:27   #1
kalindriv
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];
}
Il problema è che non saprei proprio come scriverlo.... qualcuno di voi potrebbe darmi delle dritte??

Sarebbe piattaforma indipendente...
kalindriv è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2008, 09:58   #2
recoil
Senior Member
 
L'Avatar di recoil
 
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
recoil è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2008, 10:08   #3
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12113
Quote:
Originariamente inviato da kalindriv Guarda i messaggi
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];
}
Il problema è che non saprei proprio come scriverlo.... qualcuno di voi potrebbe darmi delle dritte??

Sarebbe piattaforma indipendente...
a, b, e c sono array di booleani?
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à
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2008, 12:13   #4
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da kalindriv Guarda i messaggi
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];
}
Il problema è che non saprei proprio come scriverlo.... qualcuno di voi potrebbe darmi delle dritte??

Sarebbe piattaforma indipendente...
Dubito che su un codice del genere si possa far meglio di quanto riesca a fare il compilatore... otterrai al massimo la stessa velocita'...
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2008, 13:27   #5
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
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++);
ma non so quanto potrebbe guadagnare.
__________________
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2008, 14:18   #6
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Potrebbe provare così:
Codice:
int *x, *y, *z;
x = a; y = b; z = c;
for (k = symbLen; k; k--)
  *(z++) = *(x++) ^ *(y++);
ma non so quanto potrebbe guadagnare.
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
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2008, 20:54   #7
kalindriv
Junior Member
 
Iscritto dal: Sep 2006
Messaggi: 13
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
a, b, e c sono array di booleani?
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à
Grazie a tutti dei consigli!!
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.
kalindriv è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2008, 21:39   #8
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
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++);
Ovviamente dovresti assicurarti che symbLen sia sempre un multiplo di sizeof(MyInt), pena eventuali segmentation fault (intermittenti: i peggiori).

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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2008, 22:27   #9
marko.fatto
Senior Member
 
L'Avatar di marko.fatto
 
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?
__________________
marko.fatto è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2008, 22:31   #10
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2008, 22:33   #11
marko.fatto
Senior Member
 
L'Avatar di marko.fatto
 
Iscritto dal: Jul 2007
Messaggi: 499
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
O non si avvia o va in crash.
ah ok.. quindi non ha un comportamento ben definito nemmeno quello!?
__________________
marko.fatto è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2008, 23:19   #12
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 29-07-2008, 23:46   #13
marko.fatto
Senior Member
 
L'Avatar di marko.fatto
 
Iscritto dal: Jul 2007
Messaggi: 499
c'è anche qualcosa che non dipende dal compilatore?


ironico ovviamente
__________________
marko.fatto è offline   Rispondi citando il messaggio o parte di esso
Old 30-07-2008, 01:46   #14
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12113
Quote:
Originariamente inviato da marko.fatto Guarda i messaggi
c'è anche qualcosa che non dipende dal compilatore?


ironico ovviamente
beh..potresti anche gestire tutto in fase di avvio testando se sono supportate le SSE.. non mi pare trascendentale..

cmq alla fine col codice del topic non ho detto una cazzata tanto grande
(spero )
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 30-07-2008, 07:27   #15
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 30-07-2008, 08:32   #16
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12113
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
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.
vabbè.. tu hai postato il codice però
io ormai sono allergico al C e avrei scritto sicuramente qualche cazzata
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 30-07-2008, 08:39   #17
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 30-07-2008, 17:53   #18
Big Bamboo
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
Big Bamboo è offline   Rispondi citando il messaggio o parte di esso
Old 31-07-2008, 07:32   #19
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 31-07-2008, 16:16   #20
kalindriv
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];
questo ciclo non è ottimizzato per niente perchè richiede di fare 100 volte la moltiplicazione d*e che avrà lo stesso identico risultato.

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];
A me sembra che una scrittura così sia lenta....
kalindriv è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio HUAWEI MatePad Air recensione: OLED opaco e tast...
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica NVIDIA RTX Spark: il PC Windows on ARM costruito...
Motorola razr fold, dalla conchiglia al formato a libro. La recensione Motorola razr fold, dalla conchiglia al formato ...
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente Recensione Google Pixel Watch 5: sembra lo stess...
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo Nokia Innovation Day 2026: la sovranità e...
CERN e Mistral AI insieme per il primo L...
Le analisi approfondite sullo scudo term...
Chery Q arriva in Italia: 380 km, trazio...
Rocket Lab rinvia il primo lancio di Neu...
Tutti gli astronauti della missione spaz...
Agenti IA in azienda: il difficile non &...
Anthropic, New York chiede di rinviare l...
Meta aggiorna Edits con link audio, tend...
Hitman: Absolution si prepara al debutto...
ROG XBOX Ally X20 disponibile in Italia:...
Un banner pubblicitario può bastare per ...
Elon Musk è riuscito a farci (far...
Microsoft svela MAI-Base-2, un modello M...
Offerte Amazon fino al -50%: AirPods Pro...
Engwe fa sul serio: e-bike economica con...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:25.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v