C'è una possibilità di renderlo più veloce della tabella di ricerca se i calcoli aritmetici sono per qualche motivo più veloci dell'accesso alla memoria. Questo può essere possibile se i calcoli sono vettorizzati (PPC AltiVec o Intel SSE) e/o se altre parti del programma devono utilizzare ogni bit di memoria cache.
Se fattore di espansione = 3, sono necessari solo 7 istruzioni:
out = (((in * 0x101 & 0x0F00F) * 0x11 & 0x0C30C3) * 5 & 0x249249) * 7;
O altra alternativa, con 10 istruzioni:
out = (in | in << 8) & 0x0F00F;
out = (out | out << 4) & 0x0C30C3;
out = (out | out << 2) & 0x249249;
out *= 7;
Per altri fattori di espansione> = 3:
unsigned mask = 0x0FF;
unsigned out = in;
for (scale = 4; scale != 0; scale /= 2)
{
shift = scale * (N - 1);
mask &= ~(mask << scale);
mask |= mask << (scale * N);
out = out * ((1 << shift) + 1) & mask;
}
out *= (1 << N) - 1;
o altra alternativa, per fattori di espansione> = 2:
unsigned mask = 0x0FF;
unsigned out = in;
for (scale = 4; scale != 0; scale /= 2)
{
shift = scale * (N - 1);
mask &= ~(mask << scale);
mask |= mask << (scale * N);
out = (out | out << shift) & mask;
}
out *= (1 << N) - 1;
shift
e mask
valori da calcolare prima dell'elaborazione del flusso di bit.
fonte
2012-01-28 08:54:21
Se si tratta solo di valori a 8 bit, la tabella di ricerca è quasi sicuramente l'opzione migliore. Usa pochissimo spazio. Puoi fornire maggiori dettagli sul tuo caso d'uso e su quali operazioni ti aspetti di essere comuni? – templatetypedef
L'input è un flusso di bit seriale costante. Nell'attuale requisito, ogni blocco di dati arriva a 8 byte alla volta, il che richiede quindi che ogni bit espanso per 3 venga inviato come un altro flusso di bit. 64 bit in 192 bit fuori. Un requisito futuro può comportare l'aggiunta di bit "header" prima di ogni valore espanso a 8 bit e, naturalmente, il riempimento su un limite di byte. Le LUT sono veloci ma, vista la frequenza con cui è necessario eseguirle, qualsiasi potenziale miglioramento delle prestazioni sarebbe apprezzato. – jivany
Molte architetture dispongono di istruzioni che possono velocizzare notevolmente questo tipo di calcolo. Se non hai paura di rompere la compatibilità multipiattaforma facendo leva su queste istruzioni è quasi certamente una vittoria - e se stai ottimizzando qualcosa che questo algoritmicamente "banale", allora la chiave per l'ottimizzazione a basso livello è fondamentale. – Kaganar