假設我想對圖像Img1中的每個像素在圖像Img2中具有相應像素的兩個圖像之間進行操作(例如加法)。對應矢量存儲在元組Delta中。基本上,像這樣:在Halide中有效收集內存訪問
Img(x,y)= Img1(x,y)+ Img2(x + Delta [0](x,y),y + Delta [1](x,y)) ;
這是一個內存收集操作。在Halide中描述這種模式的最好方法是什麼?如何安排它?
假設我想對圖像Img1中的每個像素在圖像Img2中具有相應像素的兩個圖像之間進行操作(例如加法)。對應矢量存儲在元組Delta中。基本上,像這樣:在Halide中有效收集內存訪問
Img(x,y)= Img1(x,y)+ Img2(x + Delta [0](x,y),y + Delta [1](x,y)) ;
這是一個內存收集操作。在Halide中描述這種模式的最好方法是什麼?如何安排它?
有沒有一種很好的方式來安排這一點。收集速度很慢,即使收集說明存在。您可能仍然希望通過x矢量化它,以便使用矢量完成尋址數學運算和來自Img1和Delta的加載。我只是用明顯的東西:
Img.vectorize(x, 8).parallel(y, 4);
謝謝,這絕對有幫助。我同意這些收集在性能上是昂貴的。即使我有硬件支持,也可能會回到單個Delta值。 –
而不是一個元組,您可以將兩個delta值打包到另一個維度:Delta(c,x,y)= select(c == 0,xdelta, ydelta); Delta.unroll(c);'至少把這兩個值放在內存中。 –