如何使用自动调度器为 GPU 生成调度?

How to use the auto-scheduler to generate schedules for GPU?

我想重新审视SIGGRAPH'16发表的论文中关于GPU自动调度的实验

我使用自动调度程序分支编译了以下代码,但是生成的代码被安排在 CPU。

如何使用自动调度程序为 GPU 生成调度程序?

#include "Halide.h"
#include "HalideBuffer.h"
#include <climits>
#include <iostream>

using namespace Halide;

class conv2dHalide : public Halide::Generator<conv2dHalide>{
public:
    ImageParam in{UInt(8), 2, "input_image"};
    ImageParam kernel{Float(32), 2, "kernel"};

    Var x, y;

    Func build(){
        Func out("output_image");

    // Algorithm
       Func clamped_in;
       Expr k_wid = 3;
       Expr k_half = k_wid/2;
       Expr i_wid = in.width();
       Expr i_hei = in.height();
       Expr c_x = clamp(x, 0, in.width()-1);
       Expr c_y = clamp(y, 0, in.height()-1);

       clamped_in(x,y) = in(c_x,c_y);

       RDom r(-k_half, k_wid, -k_half, k_wid);
       r.where(k_half<=x && x<i_wid-k_half && k_half<=y && y<i_hei-k_half);
       out(x,y)=cast<uint8_t>(min(sum(clamped_in(x+r.x, y+r.y)*kernel(r.x+k_half, r.y+k_half)), 255.0f));

       out.estimate(x, 0, 512).estimate(y, 0, 512);
       in.dim(0).set_bounds_estimate(0, i_wid);
       in.dim(1).set_bounds_estimate(0, i_hei);
       kernel.dim(0).set_bounds_estimate(0, k_wid);
       kernel.dim(1).set_bounds_estimate(0, k_wid);

       Target target = Halide::get_host_target();
       target.set_feature(Target::CUDA);
       target.set_feature(Target::CUDACapability50);
       std::cout << "gpu enabled" << std::endl;

       Pipeline p(out);
       p.auto_schedule(target);
       out.print_loop_nest();

       return out;
    }

};

HALIDE_REGISTER_GENERATOR(conv2dHalide, "conv2dHalide")

我们(目前)削减了 GPU 的内容,同时让自动调度程序准备好合并到主线 Halide 中。我认为你必须回到 Ravi 的 Halide 叉子,他用于 siggraph 纸:

https://github.com/ravi-teja-mullapudi/Halide

我会在应用程序中查找示例,如果您在将其安排到 GPU 时遇到问题,我会在该存储库上提出问题。