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?