2017-06-10 3 views
0

Kann ein Func von einem Array in einer Generatorklasse initialisiert werden? Der Code sollte so aussehen.Func von einem Array initialisieren

class SobelConv: public Halide::Generator<SobelConv> { 

const signed char kernelx[3][3] = { 
    {-1, 0, 1}, 
    {-2, 0, 2}, 
    {-1, 0, 1} 
}; 

void generate() { 
    for (int y = 0; y < 3; y++) 
     for (int x = 0; x < 3; x++) 
      kernel_x(x, y) = kernelx[y][x]; 

    conv_x(x, y) += gray(x+win.x, y+win.y) * kernel_x(win.x + 1, win.y + 1); 
} 

Func kernel_x{"kernel_x"}; 

Derzeit ist die Art, wie ich tat, ist Input<Buffer<int8_t>> kernel_x zu definieren. Ich möchte nicht, dass es ein Argument der Pipeline-Funktion ist, und möchte, dass kernel_x direkt durch die entsprechenden Zahlen ersetzt wird.

Antwort

1

Folgende compiliert und zeigt eine Möglichkeit, dies zu tun:

#include "Halide.h" 

class SobelConv: public Halide::Generator<SobelConv> { 
    signed char weights[3][3] = { 
    {-1, 0, 1}, 
    {-2, 0, 2}, 
    {-1, 0, 1} 
    }; 

    Input<Buffer<int8_t>> gray{"gray", 2}; 
    Halide::Buffer<int8_t> kernel_x{&weights[0][0], 3, 3}; 

    Output<Buffer<int8_t>> conv_x{"conv_x", 2}; 

    Var x, y; 
    RDom win{0, 3}; 

    void generate() { 
    conv_x(x, y) += gray(x+win.x, y+win.y) * kernel_x(win.x + 1, win.y + 1); 
    } 
}; 

Die Gewichte in den generierten Code während der Kompilierung eingebettet werden. Wir sollten einen Weg haben, um die konstanten Werte für die Gewichte in einer Initialisierungsliste ebenfalls bereitzustellen, aber ich finde es im Moment nicht.

+2

Wenn Sie ein statisches Array haben, 'Halide :: Runtime :: Buffer' kann mit dem Array initialisiert werden:' kernel_x {Gewichte} '. Die Dimensionalität und Ausmaße werden erkannt. –

Verwandte Themen