2017-10-13 80 views
0

我得到了一個函數f(x,y,z),其值爲1和0,並且我需要獲得等於值的前100個座標到1,減少/更新到0.Halide:通過特定值的域減少

這是非常簡單的實現在C和其他語言,但是,我一直在試圖解決它與鹵化物幾天。是否有任何函數或算法可用於在Halide Generator中解決它?

回答

1

這個問題相當於「我如何在鹵化物中實施物流壓實?」有很多關於平行流壓縮的文章,做得很好也是有點不重要的。看到這個堆棧溢出答案在CUDA做了一些討論和參考:CUDA stream compaction algorithm

使用前綴總和滷的快速實現簡單的流壓實看起來像這樣:

#include "Halide.h" 
#include <iostream> 

using namespace Halide; 

static void print_1d(const Buffer<int32_t> &result) { 
    std::cout << "{ "; 
    const char *prefix = ""; 
    for (int i = 0; i < result.dim(0).extent(); i++) { 
     std::cout << prefix << result(i); 
     prefix = ", "; 
    } 
    std::cout << "}\n"; 

} 

int main(int argc, char **argv) { 
    uint8_t vals[] = {0, 10, 99, 76, 5, 200, 88, 15}; 
    Buffer<uint8_t> in(vals); 

    Var x; 
    Func prefix_sum; 

    RDom range(1, in.dim(0).extent() - 1); 
    prefix_sum(x) = (int32_t)0; 
    prefix_sum(range) = select(in(range - 1) > 42, prefix_sum(range - 1) + 1, prefix_sum(range - 1)); 

    RDom in_range(0, in.dim(0).extent()); 
    Func compacted_indices; 
    compacted_indices(x) = -1; 
    compacted_indices(clamp(prefix_sum(in_range), 0, in.dim(0).extent() - 1)) = select(in(in_range) > 42, in_range, - 1); 

    Buffer<int32_t> sum = prefix_sum.realize(8); 
    Buffer<int32_t> indices = compacted_indices.realize(8); 

    print_1d(sum); 
    print_1d(indices); 

    return 0; 
} 
+0

謝謝你,Zalman的。獲得座標的方式令人印象深刻。但是,對於多維度,如果我想要使用這種方法,輸入必須是緩衝區,是否有可能在發生器中實現緩衝區? – user8769167

+0

例如,我得到發電機中的af(x,y,z),我認爲有必要將它減少到1維以prefix_sum它,這需要實現f(x,y,z)到緩衝區,是否有可能實現它並獲得發電機中的緩衝區? – user8769167

+0

您應該可以使用多維'RDom'來做2D前綴求和。可能有一些事情出錯了。如果減少'Func'是輸出,那麼邊界不能超過數據的邊界。 (例如,當第一個有效結果爲0時,寫入初始值爲-1的簡化很容易)。您看到了什麼錯誤? –