用于GPU上的瓦片度量和调度的Halide
Halide for tile metric and scheduling on GPU
我正试图在灰度图像的正方形瓦片(8x8(上实现一个度量,产生3个输出(梯度的累积、瓦片的最大值和最小值(:每个输出都是一个尺寸为(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的。有什么帮助吗?
关于将三个结果打包到元组中的注释是将它们全部计算在一起的最简单方法。
关于:GPU时间表,你看了apps
文件夹中的示例吗?他们中的一些人已经考虑好了完整的GPU时间表,应该会证明是有用的。
相关文章:
- 如何在c++中实现处理器调度模拟器
- 如何在 C++17 STL 并行算法中处理调度?
- 无法使用迭代器标记调度实例化模板
- 在 c++11 中为 pthread 设置调度参数
- 如何在 assert() 和 static_assert() 之间调度,如果在 constexpr 上下文中依赖?
- 如何使用从处理程序调度的最终回调将响应异步返回给调用方on_read?
- C++双重调度
- 动态调度到模板函数C++
- 正确调度消息 UART
- 在 C++ 中使用枚举而不是结构进行标记调度
- 如何实现从 Windows 脚本主机到脚本的事件调度
- C++内置类型的基于类型的调度
- 用于GPU上的瓦片度量和调度的Halide
- 如何生成带浮点参数的Halide函数
- SFINAE和标签调度之间的差异
- C++ 如何按标签调度到不同的模板函数
- 在 boost::asio 中发布和调度有什么区别?
- 5 CPU的任务调度N进程
- 究竟发生了什么,我们需要在 c++ 中双重调度/访客
- openMp 动态调度与按处理时间排序任务时的 LPT 调度相同吗?