具有 GPU 时间表的卤化物产生黑色图像

Halide with GPU schedule produce black image

本文关键字:黑色 图像 卤化物 GPU 时间表 具有      更新时间:2023-10-16

我正在尝试学习 Halide,但我无法正确使用 GPU,因为它在为 GPU 安排时会生成黑色图像。对于 CPU,它会产生良好的结果(当注释掉 brighter.gpu_tile(x, y, xo, yo, xi, yi, 8, 8(时;)

#include "Halide.h"
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
void MinimalGpuExample() {
cv::Mat img = cv::imread("test_in.bmp",cv::IMREAD_GRAYSCALE);
Halide::Target target = Halide::get_host_target();
target.set_feature(Halide::Target::CUDA);
target.set_feature(Halide::Target::Debug);
Halide::Buffer<uint8_t> buf(img.data, img.cols, img.rows,1);
Halide::Func brighter;
Halide::Var x, y, c;
Halide::Expr value = buf(x, y, c);
value = Halide::cast<float>(value);
value = value * 1.5f;
value = (Halide::min)(value, 255.0f);
value = Halide::cast<uint8_t>(value);
brighter(x, y, c) = value;
Halide::Var xo, yo, xi, yi;
brighter.gpu_tile(x, y, xo, yo, xi, yi, 8, 8);
brighter.compile_jit(target);
Halide::Buffer<uint8_t> output =
brighter.realize(img.cols, img.rows, 1,target);
output.copy_to_host();
cv::Mat1b img_brither(img.rows, img.cols, output.data());
cv::imwrite("test_out.bmp", img_brither);
}
int main()
{
MinimalGpuExample();
}

我的问题是从主机上分配的缓冲区将数据传输到 GPU 的东西,因为该示例与 CUDA 调用一起打印良好的值。

void MinimalGpuExampleWorking() {
Halide::Func f;
Halide::Var x, y, xo, xi, yo, yi;
f(x, y) = x + y;
f.gpu_tile(x, y, xo, yo, xi, yi, 16, 16);
Halide::Target target = Halide::get_host_target();
target.set_feature(Halide::Target::CUDA);
target.set_feature(Halide::Target::Debug);
f.compile_jit(target);
// Run it.
Halide::Buffer<int> result = f.realize(32, 32);
// Print the result.
for (int y = 0; y < result.height(); y++) {
for (int x = 0; x < result.width(); x++) {
printf("%3d ", result(x, y));
}
printf("n");
}
}

尝试在构造输入缓冲区后立即添加 buf.set_host_dirty((。Halide 不确定这是指针后面的未初始化内存,还是在进行 GPU 分配时需要复制的实际数据。