2017-06-10 3 views
0

Est-il possible d'initialiser un Func à partir d'un tableau dans une classe de générateur? Le code devrait ressembler à ceci.Initialiser Func à partir d'un tableau

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"}; 

Actuellement, la façon dont j'ai fait est de définir Input<Buffer<int8_t>> kernel_x. Je ne veux pas que ce soit un argument de la fonction pipeline, et j'aimerais que kernel_x soit remplacé par les numéros respectifs directement.

Répondre

1

Les compiles suivantes et illustre une façon de le faire:

#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); 
    } 
}; 

Les poids seront intégrés dans le code généré au moment de la compilation. Nous devrions avoir un moyen de fournir les valeurs constantes pour les poids dans une liste d'initialisation, mais je ne le trouve pas pour le moment.

+2

Si vous avez un tableau statique, 'Halide :: Runtime :: Buffer' peut être initialisé avec le tableau:' kernel_x {poids} '. La dimensionnalité et les étendues sont détectées. –