2016-04-08 7 views
0

Der folgende Code ist Teil eines Flankenerfassungsprogramm:die Suche nach Möglichkeiten, um diesen Code zu optimieren

void detect_optimized(int width, int height, int threshold) 
{ 
    int x, y; 
    int tmp;` 
    int w = width--; 
    int h = height--; 

for (y = 1; y < w; y++) 
    for (x = 1; x < h; x++) 
    { 
     tmp = mask_product(mask,a,x,y,0); 
     if (tmp>255) 
      tmp = 255; 
     if (tmp<threshold) 
      tmp = 0; 
     c[x][y][0] = 255-tmp; 

     tmp = mask_product(mask,a,x,y,1); 
     if (tmp>255) 
      tmp = 255; 
     if (tmp<threshold) 
      tmp = 0; 
     c[x][y][1] = 255-tmp; 

     tmp = mask_product(mask,a,x,y,2); 
     if (tmp>255) 
      tmp = 255; 
     if (tmp<threshold) 
      tmp = 0; 
     c[x][y][2] = 255-tmp; 
    } 
} 

Ich habe mit dem folgenden Code zu implementieren versucht, blockierte aber ich bin nicht sicher, wie es in diesem Einsatz Fall.

+0

Sehr gering, aber Sie können 'else if' für das zweite' if' in jedem Paar verwenden. – Barmar

+1

Ich gehe davon aus, dass 'threshold' immer kleiner als 255 sein sollte. – Barmar

+1

Warum' int w = width -; 'und dann keine weitere Verwendung für' width' und daher kein Punkt dekrementieren? Geringe Effizienz durch Verwendung von 'width' und' height' als Schleifengrenzvariablen und Entfernen von 'w' und' h' wie 'for (y = 1; y

Antwort

2

Sie können die Schleifen austauschen, um eine bessere Cache-Auslastung zu erzielen. Dies sollte Ihren Code erheblich beschleunigen (besonders bei großen Datenmengen).

Ein weiterer wesentlicher Vorteil kann erreicht werden, indem die Schleifeniterationen über mehrere Threads verteilt werden, um Multicore-Architekturen auszunutzen. Mit OpenMP kann dies mit einer einzigen Compiler-Direktive wie folgt erreicht werden.

#pragma omp parallel for private(y, tmp) 
for (x = 1; x < h; x++) 
    for (y = 1; y < w; y++) 

Andere Optimierungen werden normalerweise vom Compiler vorgenommen. Stellen Sie sicher, dass Sie die entsprechenden Compiler-Flags wie -O2 verwenden und sich nicht selbst um eine Low-Level-Anpassung kümmern.

1

bieten folgende Kandidaten

  1. Vermeiden if() s zum Preis von *. Verschiedene Pipeline-Plattformen werden davon profitieren.
  2. Swap x,y bestellen
  3. Decrement so Testschleifenende gegen 0.
  4. vermeiden ist recomputing c[x][y]

obwohl alle Farben zu gehen sei angenommen benötigen.

Natürlich, YMMV.

for (x = h-1; x > 0; x--) { 
    byte *p = &c[x][w-1][NUM_COLORS-1]; 

    for (y = w-1; y > 0; y--) { 
    for (int z = NUM_COLORS-1; z >= 0; z--) { 
     int tmp = mask_product(mask,a,x,y,z); 
     *p = (255 - tmp*(tmp>=threshold))*(tmp <=255); 
     p--; 
    } 
    } 
} 
Verwandte Themen