Halide с графиком GPU дает черное изображение

Я пытаюсь изучить Halide и не могу правильно настроить GPU, потому что он генерирует черные изображения, когда запланировано для GPU. Для процессора это дает хороший результат (если закомментировать ярче.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");
    }
}

person CzakCzan    schedule 20.05.2020    source источник


Ответы (1)


Попробуйте добавить buf.set_host_dirty() сразу после того, как вы создадите свой входной буфер. Halide не уверен, является ли это неинициализированной памятью за вашим указателем или фактическими данными, которые необходимо скопировать при выделении памяти графическим процессором.

person Andrew Adams    schedule 20.05.2020