首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GPU上实现瓦片度量和调度的Halide

在GPU上实现瓦片度量和调度的Halide
EN

Stack Overflow用户
提问于 2018-07-31 17:58:56
回答 1查看 265关注 0票数 1

我正在尝试实现一个在灰度图像的平方瓦片(8x8)上工作的度量,产生3个输出(渐变,瓦片的最大和最小的累积):每个输出都是一个尺寸为(IMG_WIDTH/8;IMG_HEIGHT/8)的图像。在下面的实现中,3个结果是单独计算的,但我想把它们都计算在一起;此外,我找不到一个好的gpu时间表:

代码语言:javascript
复制
#define IMAGE_WIDTH     (1280)
#define IMAGE_HEIGHT    (1024)
#define TILE_SIZE       (8)

    Halide::Buffer<uint8_t> input_image(IMAGE_WIDTH, IMAGE_HEIGHT);

    Halide::Var xo, yo, xi, yi;

    Halide::Func tiled_input;
    tiled_input(xi, yi, xo, yo) = input_image(Halide::clamp(xo * TILE_SIZE + xi, 0, input_image.width()-1),
                                              Halide::clamp(yo * TILE_SIZE + yi, 0, input_image.height()-1));


    Halide::Expr gradientX, gradientY;
    gradientX = Halide::cast<int16_t>(tiled_input(xi+1, yi, xo, yo)) - Halide::cast<int16_t>(tiled_input(xi-1, yi, xo, yo));
    gradientY = -(Halide::cast<int16_t>(tiled_input(xi, yi+1, xo, yo)) - Halide::cast<int16_t>(tiled_input(xi, yi-1, xo, yo)));

    Halide::Expr agx, agy, m;
    agx = Halide::abs(gradientX);
    agy = Halide::abs(gradientY);
    m = Halide::select(agx > agy, agx+(agy/2), agy+(agx/2));


    Halide::RDom tile_domain(0, TILE_SIZE, 0, TILE_SIZE);
    Halide::Func tiled_output_x, tiled_output_y;
    tiled_output_x(xi, yi, xo, yo) = Halide::cast<int16_t>(m);



    Halide::Func  accx;
    Halide::Func tiled_output_max, tiled_output_min;

    accx(xo, yo) = Halide::sum(tiled_output_x(tile_domain.x, tile_domain.y, xo, yo));
    tiled_output_max(xo, yo) = Halide::maximum(tiled_input(tile_domain.x, tile_domain.y, xo, yo));
    tiled_output_min(xo, yo) = Halide::minimum(tiled_input(tile_domain.x, tile_domain.y, xo, yo));

    Halide::Buffer<int16_t> output_buffer_accx(input_image.width()/TILE_SIZE, input_image.height()/TILE_SIZE);
    Halide::Buffer<uint8_t> output_buffer_max(input_image.width()/TILE_SIZE, input_image.height()/TILE_SIZE);
    Halide::Buffer<uint8_t> output_buffer_min(input_image.width()/TILE_SIZE, input_image.height()/TILE_SIZE);

    accx.realize(output_buffer_accx, get_host_target());
    tiled_output_max.realize(output_buffer_max, get_host_target());
    tiled_output_min.realize(output_buffer_min, get_host_target());

一个好的CPU时间表可以是:

代码语言:javascript
复制
    accx.vectorize(xo, TILE_SIZE).parallel(yo);
    tiled_output_max.vectorize(xo, TILE_SIZE).parallel(yo);
    tiled_output_min.vectorize(xo, TILE_SIZE).parallel(yo);

但是我找不到适合GPU的。有什么帮助吗?

EN

回答 1

Stack Overflow用户

发布于 2018-08-02 02:28:49

关于将三个结果打包到一个元组中的注释是将它们全部计算在一起的最简单方法。

Re:图形处理器时间表,你看过apps文件夹中的例子了吗?他们中的一些人有经过深思熟虑的完整的GPU时间表,这应该会被证明是有用的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51610657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档