2017-10-13 47 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的简化很容易)。您看到了什么错误? –