Ho bisogno di eseguire alcune divisioni di interi nel percorso caldo del mio codice. Ho già determinato tramite il profiling e il conteggio dei cicli che le divisioni intere mi stanno costando. Spero che ci sia qualcosa che posso fare per forza ridurre le divisioni in qualcosa di più economico.Come posso ridurre la divisione per 2^n + 1?
In questo percorso, sto dividendo per 2^n + 1, dove n è variabile. In sostanza voglio ottimizzare questa funzione per rimuovere l'operatore di divisione:
unsigned long compute(unsigned long a, unsigned int n)
{
return a/((1 << n) + 1);
}
Se fossi dividendo per 2^n, vorrei solo sostituire il div con uno spostamento a destra per n. Se dividessi per una costante, lascerei che la forza del compilatore riducesse quella divisione specifica, probabilmente trasformandola in una moltiplicazione e in alcuni cambiamenti.
Esiste un'ottimizzazione simile a 2^n + 1?
Modifica: un qui può essere un numero arbitrario a 64 bit. n richiede solo alcuni valori tra 10 e, ad esempio, 25. Posso certamente precomputare alcuni valori per ogni n, ma non per a.
Vi sono vincoli sui valori di una e n? –
Qual è il contesto in cui stai chiamando la funzione? – GManNickG
'return a/lookup [n];' –