gpt4 book ai didi

c++ - 用于 GPU 上的瓦片度量和调度的 Halide

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:55 24 4
gpt4 key购买 nike

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

#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 的良好调度可以如下所示:

    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 的。有什么帮助吗?

最佳答案

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

Re: GPU schedule,你看过apps文件夹里的例子了吗?其中一些具有经过深思熟虑的完整 GPU 计划,应该证明是有用的。

关于c++ - 用于 GPU 上的瓦片度量和调度的 Halide,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51610657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com