卤化物:减少特定值的范围 [英] Halide: Reduction over a domain for the specific values

查看:82
本文介绍了卤化物:减少特定值的范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我得到一个函数f(x,y,z),其中值是1和0,并且我需要获取等于1的值的前100个坐标,以将它们减少/更新为0

I got a func f(x, y, z) in which the values is either 1 and 0, and I need to get the the first 100 coordinates of the values which equals to 1, to reduction/update them to 0.

使用c语言和其他语言来实现非常简单,但是,我已经尝试使用Halide解决了几天.在卤化物发生器中有什么函数或算法可以用来解决它?

This is very simple to realize in c and other languages, However, I've been trying to solve it with Halide for a couple of days. Is there any Function or Algorithm that I can use to solve it in Halide Generators?

推荐答案

问题在于如何在Halide中实现流压缩?"关于并行流压缩有很多文章,要做得好一点也不平凡.请参阅有关在cuda中执行此操作的Stack Overflow答案,以获取一些讨论和参考: CUDA流压缩算法

The question amounts to "How do I implement stream compaction in Halide?" There is much written on parallel stream compaction and it is somewhat non-trivial to do well. See this Stack Overflow answer on doing it in cuda for some discussion and references: CUDA stream compaction algorithm

在Halide中使用前缀和快速实现简单流压缩的方式如下:

An quick implementation of simple stream compaction in Halide using a prefix sum looks like so:

#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;
}

这篇关于卤化物:减少特定值的范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆