具有 GPU 计划的卤化物产生黑色图像

Halide with GPU schedule produce black image

我正在尝试学习 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 分配时需要复制的实际数据。