Halide 有没有一种方法可以指定在四分之一像素上运行的卤化物计算?
在Halide中,是否有方法将输入图像分割为2x2个四分之一像素,并在四分之一像素中的每个像素中实现唯一的计算 例如,我想对四重奏中的每个像素执行以下计算:Halide 有没有一种方法可以指定在四分之一像素上运行的卤化物计算?,halide,Halide,在Halide中,是否有方法将输入图像分割为2x2个四分之一像素,并在四分之一像素中的每个像素中实现唯一的计算 例如,我想对四重奏中的每个像素执行以下计算: Upper left: (x + 1, y) + (x - 1, y) + (x, y + 1) + (x, y - 1) Upper right: (x + 1, y) + (x - 1, y) Lower left: (x, y + 1) + (x, y - 1) Lower right: (x - 1, y - 1) + (x + 1
Upper left: (x + 1, y) + (x - 1, y) + (x, y + 1) + (x, y - 1)
Upper right: (x + 1, y) + (x - 1, y)
Lower left: (x, y + 1) + (x, y - 1)
Lower right: (x - 1, y - 1) + (x + 1, y - 1) + (x - 1, y + 1) + (x + 1, y + 1)
我希望这个计算模式能够扩展到整个输入图像。有很多方法可以做到这一点。您可以使用
x%2==0
和y%2==0
上的select
最直接地执行此操作。比如:
//子术语
Expr ul=in(x+1,y)+in(x-1,y)+in(x,y+1)+in(x,y-1);
Expr-ur=in(x+1,y)+in(x-1,y);
Expr ll=in(x,y+1)+in(x,y-1);
Expr ul=in(x-1,y-1)+in(x+1,y-1)+in(x-1,y+1)+in(x+1,y+1);
Expr ix=x%2==0;
Expr iy=y%2==0;
out(x,y)=选择(iy,
选择(ix、ul、ur),
选择(ix、ll、lr));
(还有一个select
,您可以将其打包到其中。)
然后,如果将out
的x
和y
维度分别展开2,您将在四重奏上获得一个紧密的循环,没有控制流:
out.unroll(x,2).unroll(y,2);
这与你在去马赛克算法中看到的模式非常相似,你可以在官方卤化物参考应用程序中找到一种。受此启发,您可能会发现将数据从二维打包到三维是很自然的,三维是四重奏的4个元素:
压缩(x,y,c)=in(x+c%2,y+c/2);
在某些情况下,您可能会发现使用它更容易