[Assembly] Xor o Add
Leggendo questo articolo mi sono chiesto quale sia la sua valenza con le cpu multicore di oggi e la risposta è quella che non conta molto.
Ma in ambito embedded è lo stesso?
Voi cosa ne pensate?
Just my 2 cents
Ma in ambito embedded è lo stesso?
Voi cosa ne pensate?
Just my 2 cents
Risposte
I compilatori sono molto bravi a fare questo tipo di ottimizzazioni. A meno di scrivere direttamente il codice in assembly è probabile che il codice prodotto dai due codici sia lo stesso.
"vict85":
I compilatori sono molto bravi a fare questo tipo di ottimizzazioni. A meno di scrivere direttamente il codice in assembly è probabile che il codice prodotto dai due codici sia lo stesso.
Io intendevo proprio a livello macchina.
Ma penso che oramai siano cosi ottimizzati e veloci che non si noterebbe alcuna differenza

Come già detto i compilatori fanno il loro dovere nell'ottimizzazione del codice. Queste operazioni però sono effettuate tutte al livello elettronico, quindi, se ci sono ottimizzazioni da fare, non spettano al programmatore.
Edit: Riguardo al multicore: non pensare che una cpu multicore aumenti le prestazioni migliorando queste operazioni di base. Il multicore permette di affibbiare un processo per ogni core, in modo tale da avere più processi che vengono eseguiti (veramente) nello stesso istante. Fare in modo che un singolo programma, invece, sfrutti più cores è un altro paio di maniche: bisogna essere in grado di sviluppare software in grado di sfruttare il calcolo parallelo (non una passeggiata).
Edit: Riguardo al multicore: non pensare che una cpu multicore aumenti le prestazioni migliorando queste operazioni di base. Il multicore permette di affibbiare un processo per ogni core, in modo tale da avere più processi che vengono eseguiti (veramente) nello stesso istante. Fare in modo che un singolo programma, invece, sfrutti più cores è un altro paio di maniche: bisogna essere in grado di sviluppare software in grado di sfruttare il calcolo parallelo (non una passeggiata).
"ulven101":
Riguardo al multicore: non pensare che una cpu multicore aumenti le prestazioni migliorando queste operazioni di base. Il multicore permette di affibbiare un processo per ogni core, in modo tale da avere più processi che vengono eseguiti (veramente) nello stesso istante. Fare in modo che un singolo programma, invece, sfrutti più cores è un altro paio di maniche: bisogna essere in grado di sviluppare software in grado di sfruttare il calcolo parallelo (non una passeggiata).
Sinceramente non comprendo il commento. Se cambi il processore e addirittura l'architettura allora cambi tutto. Su un ALU del Cell processor le cose sono piuttosto diverse che da un processore multicore x64, un ARM o una GPU. Spesso cambia molto anche solo cambiando produttore. Ogni singolo core di un processore multicore, soprattutto all'inizio, può essere anche molto più lento di un processore single core della stessa fascia di prestazioni.
Detto questo è spesso molto difficile fornire una buona definizione di cosa sia la performance. Una GPU, per esempio, ha un numero di FLOP superiore ad un processore INTEL ma per molte operazioni il processore INTEL è più veloce (finisce il calcolo prima*).
* anche trascurando il tempo richiesto per trasferire i dati nella memoria della GPU.
Tornando alla domanda originale, quello che chiami "ambito embedded" è talmente ampio che è del tutto impossibile darti una risposta. In questo ambito si possono trovare processori a 8 bit e processori multicore a 64 bit della ARM. Difficilmente possono essere confrontati. E forse non ha neanche più di tanto senso come domanda. Uno XOR e una somma fanno cose diverse.. Immagino che ci siano algoritmi che fanno la stessa cosa ma basati o su XOR o sulle somme, ma ci sono secondo me tantissime altre cose da considerare prima del costo delle somme o degli XOR. Considera per esempio che un cache miss (nelle cache L2 e L3 soprattutto) è in alcuni casi centinaia o migliaia di volte più costoso di uno XOR o di una somma nella maggior parte delle architetture moderne. Se tutto quello che fai sono somme e XOR, allora sarà l'accesso alla memoria probabilmente a dominare le performance del tuo algoritmo.
"vict85":
[quote="ulven101"] Riguardo al multicore: non pensare che una cpu multicore aumenti le prestazioni migliorando queste operazioni di base. Il multicore permette di affibbiare un processo per ogni core, in modo tale da avere più processi che vengono eseguiti (veramente) nello stesso istante. Fare in modo che un singolo programma, invece, sfrutti più cores è un altro paio di maniche: bisogna essere in grado di sviluppare software in grado di sfruttare il calcolo parallelo (non una passeggiata).
Sinceramente non comprendo il commento. Se cambi il processore e addirittura l'architettura allora cambi tutto. Su un ALU del Cell processor le cose sono piuttosto diverse che da un processore multicore x64, un ARM o una GPU. Spesso cambia molto anche solo cambiando produttore. Ogni singolo core di un processore multicore, soprattutto all'inizio, può essere anche molto più lento di un processore single core della stessa fascia di prestazioni.[/quote]
Forse non sono stato chiaro. Certo che sono diverse, ma non si stanno a reinventare ogni volta il circuito ottimizzato per eseguire la somma o lo Xor logico, l'unico fattore che entra in gioco in quel caso è semplicemente la potenza del singolo core.
Lo xor è già in forma minimale così com'è quindi non viene studiato più di tanto, ma ci sono persone che cercano di ottimizzare i circuiti per la somma (nonché tutte le altre operazioni su interi e floating point). Anche se immagino che gli studi siano più improntati verso i numeri molto grandi.
In ogni caso immagino che tu non abbia esperienza di programmazione eterogenea. Il punto è che se tu hai \(10^9\) somme indipendenti da fare, una cpu da \(10\) core che ci mette \(1s\) per ogni somma ma finirà comunque dopo di un processore fortemente parallelo che ci mette \(10s\) per ogni somma ma fa \(200\) somme alla volta. La programmazione con cuda o opencl si basa su questo principio.
In ogni caso immagino che tu non abbia esperienza di programmazione eterogenea. Il punto è che se tu hai \(10^9\) somme indipendenti da fare, una cpu da \(10\) core che ci mette \(1s\) per ogni somma ma finirà comunque dopo di un processore fortemente parallelo che ci mette \(10s\) per ogni somma ma fa \(200\) somme alla volta. La programmazione con cuda o opencl si basa su questo principio.
"vict85":
In ogni caso immagino che tu non abbia esperienza di programmazione eterogenea. Il punto è che se tu hai \(10^9\) somme indipendenti da fare, una cpu da \(10\) core che ci mette \(1s\) per ogni somma ma finirà comunque dopo di un processore fortemente parallelo che ci mette \(10s\) per ogni somma ma fa \(200\) somme alla volta. La programmazione con cuda o opencl si basa su questo principio.
Interessante, grazie per gli spunti

Comunque, come diceva Antonio, la gestione della memoria è preponderante per la maggior parte delle applicazioni. Ciò che rende più veloce una cpu rispetto ad un computation unit della GPU è la gestione della memoria e il modo in cui gestisce le operazioni.