Ho il codice seguente
for(i=0;i<16;i++)
for(j=0;j<16;j++)
{
in=(i+u*j+rl+rc)&15;
jn=(v*i+(u*v+1)*j+rc)&15;
x1[i*16+j]=x2[in*16+jn];
}
alcune note:
rl
,rc
,u
, ev
i valori randome variano da 0 a 15x1
ex2
sono matrici di 256 valori, l'intervallo di ciascun valore di matrice è compreso tra 0 e 255- se voglio implementare questo codice utilizzando la tabella di ricerca è necessario 16 MB e questa memoria di grandi dimensioni
risposte:
2 per risposta № 1Qualche idea potresti provare:
Potresti creare una tabella di ricerca per tutte le combinazioni di u
e v
, che richiederebbe solo 64k di memoria. rl
e rc
funzionano come offset costanti in orizzontale e verticale (potrebbero essere spostati in ultima dichiarazione e non devono partecipare al calcolo di in
e jn
). Ciò ridurrebbe la quantità di matematica che devi fare.
Come con qualsiasi altra ottimizzazione delle prestazioniprima di tutto bisogna vedere se questo è veramente il collo di bottiglia. Potrebbe essere che la memoria sia molto più lenta e l'introduzione di una grande tabella di ricerca rallenterebbe solo le cose.
4 per risposta № 2
Ecco una sola idea:
Prova ad estrarre parti del calcolo che non cambiano al di fuori almeno del ciclo interno. Ad esempio, i + rl + rc
dal in
il calcolo non ha bisogno di essere all'interno del ciclo: una volta che lo hai, ti rendi conto del valore di in
aumenta di u
ogni iterazione, modulo 16 ovviamente. Quindi, invece di fare una moltiplicazione, puoi fare un'aggiunta.
Il jn
calcolo ha anche citare alcune cose che puoi estrarre.
Certo, questo è presumendo che tu in realtàsappi che questo è un collo di bottiglia per le prestazioni (profilo!) e il compilatore non è abbastanza intelligente da fare una tale ottimizzazione per il tuo. In caso di dubbio, ispeziona l'assemblaggio.