2017-11-16 11 views
0

Generatorの中から行列 - 行列乗算を実行しようとしています。以前は他の関数と同じようにdefine_externを使用していたはずですが、何らかの理由でGEMM(つまりBLASのmat-mat multiply)を使用した場合、segfaultが発生します。ハライド:ジェネレータ内からBLAS演算を実行

はここに私のコードです:いくつかのapps/linear_algebraスクリプトで

class TestBLAS : public Halide::Generator<TestBLAS> {           
public:                             
    Input<Buffer<float>> A{"A", 2};                
    Input<Buffer<float>> B{"B", 2};                
    Output<Buffer<float>> C{"C", 2};                

    Var x,y;                      

    void generate() {                   
     Func g;                     
     g.define_extern("hblas_sgemm", {false, false, 1.f, A, B, 0.f}, type_of<float>(), 2); 

     C(x,y) = g(x,y);                   
    }                       
};                        

HALIDE_REGISTER_GENERATOR(TestBLAS, testblas)             

、私はHalide::Runtime::Buffer::raw_buffer()が渡されました。 Halide::GeneratorInput<Halide::Buffer<float> >またはHalide::Funcからこのポインタにアクセスするにはどうすればよいですか?

Funcの未知の境界がわかりにくいと理解していますが、その情報を別途提供する方法はありますか?

はファビアンの応答@の後、私は発電機の中からcontextを初期化するために管理しますが、最も近いされていない:docs私は方法を見つけるしていないようです...

Updateから

私は、コードの作業はこれをした作りになった:

... 
GEMMGenerator<float> gemm; 
void generate() { 
    gemm.set_inputs(1., A, B, 0., B);  
    C = gemm.result_; 
} 

これはコンパイルが、私はそれを実行したときに、私が取得:

Condition failed: funcs_.size() == array_size() && exprs_.empty() 
Aborted (core dumped) 

これを回避する方法はありますか?

答えて

0

あなたのコードを見ると、別のGeneratorをgenerate()で使用したいと思っています。 これがうまくいくはずです:

auto gen = context.create<GEMMGenerator<float>>(); 
gen->transpose_A_.set(false); // GeneratorParam 
gen->apply(a, A, B, ...); // Inputs 
Func res = gen->result_; 
+0

私は 'context'をどのように初期化するつもりですか?また、入力またはFuncsを渡した場合にのみ、この機能が動作しますか? – zanbri

+0

少し精巧に質問を更新しました。ありがとう。 – zanbri

関連する問題