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