2017-01-27 3 views
1

Ich führe einen Filter auf ein Bild und ich führe einen vertikalen Durchlauf durch, gefolgt von einem horizontalen Durchlauf. Die Funktion für diese Aufgabe ist für beide Durchgänge gleich, nur die Argumentwerte ändern sich. Ich rufe die Funktion in einer Schleife auf. Zum Vektorisieren der Operationen in dieser Funktion muß ich getrennte Funktionsaufrufe für die zwei Durchläufe schreiben. Die Schleife ist jetzt getrennt für horizontale und vertikale Durchgänge. Eine "if-Bedingung" wird nun aufgrund dieser Änderung hinzugefügt, und ich habe festgestellt, dass der Kernel zwar mehr Zeit benötigt, um ausgeführt zu werden, obwohl die Berechnungen vektorisiert sind. Ich habe den Code mehrmals ausgeführt und die durchschnittliche Zeit mit dem vektorisierten Code ist mehr als der ursprüngliche Code. Ist es wegen der "if-Bedingung" in den Code gesteckt?Beeinflussen "if-Bedingungen" die Leistung der Kernel-Ausführung in OpenCL?

Originalcode

global int* a; 

for(int i = 0; i < 4; i++) 
{ 
    filter(a + i, b, c); 
} 

Modified Code

global int* a; 

if(offset == 1) 
for(int i = 0; i < 4; i++) 
{ 
    filter_vertical(a + i, b, c); 
} 
else 
    filter_horizontal(a, b, c); 
+0

Bitte zeigen Sie uns Ihr Beispielcode-Fragment. Die Art, wie Sie die 'if'-Anweisung verwenden, kann die Antwort ändern. –

Antwort

1

Haben Sie offset == 1 bedeuten?

if(offset = 1) 

weist 1 Offset zu, was eine "zusätzliche Latenz" pro Thread ist. Das ist langsamer als das Original. Aber abgesehen davon ändert "if" die Leistung je nach dem Muster einer Verzweigung "genommen" oder "nicht genommen" gruppiert zusammen, weil einige Architekturen wie GPU SIMD Blasen zu parallelen SIMD-Pipelines füllen, wenn diese nicht die gleiche Verzweigungsoption sind mit einer Nachbarpipeline, so dass sie anderen Berufswegen der Wellenfront-Threads überlassen werden, wenn sie nicht niter füllen können, wird sie weniger Leistung haben.

für mehr Leistung,

for(int i = 0; i < 4; i++) 
{ 
    filter_vertical(a + i, b, c); 
} 

zu

filter_vertical(a , b, c); 
    filter_vertical(a + 1, b, c); 
    filter_vertical(a + 2, b, c); 
    filter_vertical(a + 3, b, c); 

braucht mehr Befehls-Cache, aber braucht weniger Verzweigungen, benötigt weniger Speicherverbrauch und weniger Zyklen.

Wenn Sie Offset == 1 Fälle zusammen gruppieren können, wäre es schneller, wenn Speicherzugriffsvorgänge es nicht beeinflussen.

Verwandte Themen