2017-08-07 24 views
1

SIGGRAPH'16で公開された論文で、GPUの自動スケジューリングに関する実験を再検討したいと思います。自動スケジューラを使用して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") 

答えて

0

自動スケジューラをメインラインのハライドにマージする準備が整い次第、GPUの内容をカットします。私はあなたが、彼はSIGGRAPH紙に使用ラヴィのハロゲンフォークに戻って行かなければならないと思う:

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

私は例のためのアプリで見て、あなたがしている場合はそのレポ上の問題を開くだろうそれをGPUにスケジュールするのに問題があります。

関連する問題