2016-10-03 2 views
0

Ich versuche, einige Schablone Berechnung mit Halogenid zu tun. Unter der Annahme einer grundlegenden 5-Punkt-2D-Schablone, um einen Wert in der Zelle i, j auszuwerten, brauche ich die Werte von i-1, ji-2, j, i + 1, ji + 2, j. Nun ist die Möglichkeit, dies in C++ gewohnt ist, dass ich eine für Aussage haben:Probleme mit Halide Select-Anweisung

for(int i = 2; i < max_i - 2; i++) 
for(int j = 2; j < max_j - 2; j++) 
Calculate out = some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j)) 

Jetzt versuche ich die gleiche Sache mit Halide zu tun. Ich habe also einen Puffer, der den gleichen Wert wie mein Eingabe-Array im C++ - Code hat. Und ich habe so genannten Func out:

out(i,j) = select(i >= 2 && j >= 2, some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j)) ,0.0f)

Wenn ich diesen Code ausführen ich die folgende Fehlermeldung erhalten:

Error: Input buffer b0 is accessed at -1, which is before the min (0) in dimension 0 Aborted (core dumped)

Von meinem Verständnis ist der Grund für diesen Fehler ist, dass die Select-Anweisung auswertet beide Aussagen so, obwohl ich nichts für i und j Werte kleiner als zwei berechnen möchte, wird die Funktion bei i = 0 und j = 0 ausgewertet und damit der ungültige Adresszugriff.

Also gibt es das in Halide? Gibt es noch andere Entsprechungen für if/else-Anweisungen?

Antwort

2

eine Randbedingung verwenden wird tun, was Sie wollen: Func unbounded; unbounded(i, j,) = some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j)); out(i, j) = BoundaryConditions::constant_exterior(unbounded, 0.0f, 2, width - 4, 2, height - 4)(i, j);

Ich glaube, Sie „Expr()“ statt „Breite - 4“ verwenden oder „Höhe - 4“, wenn Sie die maximale unbeschränkten wollen.

Die Verwendung von BoundaryConditions-Funktionen ermöglicht es, dem Compiler zu zeigen, welche Richtung des If/Else-Konstrukts wahrscheinlicher ist.