/ / Ottimizza un codice c su ciclo annidato - c, prestazioni, ottimizzazione, ciclo continuo

ottimizzare un codice c su ciclo annidato - c, prestazioni, ottimizzazione, ciclo continuo

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:

  1. rl,rc,u, e v i valori randome variano da 0 a 15
  2. x1 e x2 sono matrici di 256 valori, l'intervallo di ciascun valore di matrice è compreso tra 0 e 255
  3. se voglio implementare questo codice utilizzando la tabella di ricerca è necessario 16 MB e questa memoria di grandi dimensioni

risposte:

2 per risposta № 1

Qualche 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.