0
我得到了一个函数f(x,y,z),其值为1和0,并且我需要获得等于值的前100个坐标到1,减少/更新到0.Halide:通过特定值的域减少
这是非常简单的实现在C和其他语言,但是,我一直在试图解决它与卤化物几天。是否有任何函数或算法可用于在Halide Generator中解决它?
我得到了一个函数f(x,y,z),其值为1和0,并且我需要获得等于值的前100个坐标到1,减少/更新到0.Halide:通过特定值的域减少
这是非常简单的实现在C和其他语言,但是,我一直在试图解决它与卤化物几天。是否有任何函数或算法可用于在Halide Generator中解决它?
这个问题相当于“我如何在卤化物中实施物流压实?”有很多关于平行流压缩的文章,做得很好也是有点不重要的。看到这个堆栈溢出答案在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;
}
谢谢你,Zalman的。获得坐标的方式令人印象深刻。但是,对于多维度,如果我想要使用这种方法,输入必须是缓冲区,是否有可能在发生器中实现缓冲区? – user8769167
例如,我得到发电机中的af(x,y,z),我认为有必要将它减少到1维以prefix_sum它,这需要实现f(x,y,z)到缓冲区,是否有可能实现它并获得发电机中的缓冲区? – user8769167
您应该可以使用多维'RDom'来做2D前缀求和。可能有一些事情出错了。如果减少'Func'是输出,那么边界不能超过数据的边界。 (例如,当第一个有效结果为0时,写入初始值为-1的简化很容易)。您看到了什么错误? –