C++ 卤化物-有没有办法将缓冲区解释为Func?[编辑:自行解决]

C++ 卤化物-有没有办法将缓冲区解释为Func?[编辑:自行解决],c++,halide,C++,Halide,我只是想知道在Halide中是否有任何方法可以将缓冲区解释为Func(即更好的标识函数)。而且,我的很多代码看起来都是冗余的,所以如果可以用更好的风格来编写,那会是什么样子呢 下面是我所说的示例(注意:出于其他原因,我必须使用行主表示法): 当前: #define HEIGHT dim(0).extent() #define WIDTH dim(1).extent() //modular addition (needs to accept Funcs as inputs //because i

我只是想知道在Halide中是否有任何方法可以将缓冲区解释为Func(即更好的标识函数)。而且,我的很多代码看起来都是冗余的,所以如果可以用更好的风格来编写,那会是什么样子呢

下面是我所说的示例(注意:出于其他原因,我必须使用行主表示法):

当前:

#define HEIGHT dim(0).extent()
#define WIDTH dim(1).extent()

//modular addition (needs to accept Funcs as inputs
//because it will be part of a pipeline)
Halide::Func add(Halide::Func f1, Halide::Func f2, int64_t modulus) {
    Halide::Var x, y;

    Halide::Func add_temp;
    if (modulus > 1)
        add_temp(x, y) = (f1(x, y) + f2(x, y)) % Halide::Expr(modulus);
    else
        add_temp(x, y) = f1(x, y) + f2(x, y);

    return add_temp;
}

int main() {//testing the "add" function
    Halide::Buffer<int64_t> in1(4, 4, "in1");
    Halide::Buffer<int64_t> in2(4, 4, "in2");
    //initialize in1 and in2 to random numbers

    Halide::Buffer<int64_t> sum(4, 4, "sum");
    //side note: what does the name in the constructor even do?
    //can I just omit it? I was told to keep it.

    Halide::Func in1_id;
    Halide::Func in2_id;
    Halide::Var x, y;
    in1_id(x, y) = in1(x, y);
    in2_id(x, y) = in2(x, y);
    sum = add(in1_id, in2_id, 503).realize(4, 4);

    //print the values of sum
}
定义高度尺寸(0)。范围() #定义宽度尺寸(1).extent() //模块化加法(需要接受FUNC作为输入 //因为它将是管道的一部分) 卤化物::Func添加(卤化物::Func f1,卤化物::Func f2,整数模){ 卤化物:Var x,y; 卤化物::功能添加温度; 如果(模数>1) 添加温度(x,y)=(f1(x,y)+f2(x,y))%卤化物::Expr(模数); 其他的 加上温度(x,y)=f1(x,y)+f2(x,y); 返回添加温度; } int main(){//测试“add”函数 卤化物:缓冲in1(4,4,“in1”); 卤化物:缓冲in2(4,4,“in2”); //将in1和in2初始化为随机数 卤化物:缓冲总和(4,4,“总和”); //旁注:构造函数中的名称是做什么的? //我可以省略它吗?我被告知要保留它。 卤化物:1_id中的Func; 卤化物::Func in2_id; 卤化物:Var x,y; in1_id(x,y)=in1(x,y); in2_id(x,y)=in2(x,y); sum=add(in1id,in2id,503); //打印sum的值 } 理想(第1版):

Halide::Func add(Halide::Func f1,Halide::Func f2,int64_t模数){
//相同的定义
}
int main(){
卤化物:缓冲in1(4,4);
卤化物:缓冲in2(4,4);
//将in1和in2初始化为随机数
卤化物::缓冲和(4,4);
//in1自动解释为
//in1上的恒等式函数
求和=相加(in1,in2,503)。实现(4,4);
//打印sum的值
}
理想(第2版):

Halide::Func add(Halide::Func f1,Halide::Func f2,int64_t模数){
//相同的定义
}
int main(){
卤化物:缓冲in1(4,4);
卤化物:缓冲in2(4,4);
//将in1和in2初始化为随机数
卤化物::缓冲和(4,4);
//h_id是包含在卤化物中的东西
//作为任何事物的标识的库
sum=add(h_id(in1),h_id(in2),503);
//打印sum的值
}
一开始这看起来没什么大不了的,但真正的问题是,当我必须用多个输入和多个输出制作多级管道时,我必须为每个输入定义单独的标识函数,这似乎是非常冗余和不必要的。提前感谢所有的回答者

编辑:事实上,第二天我自己就解决了这个问题。事实证明,有一个简单的解决方案。卤化物中不必包含h_id;我可以自己定义。以下是我对h_id的定义:

Halide::Func h_id(Halide::Buffer<int64_t> in) {
    Halide::Var x, y;
    Halide::Func ret;
    ret(x,y) = in(x,y);
    return ret;
}
Halide::Func h_id(Halide::Buffer in){
卤化物:Var x,y;
卤化物::Func-ret;
ret(x,y)=in(x,y);
返回ret;
}

然后,我可以轻松地在任何缓冲区上调用它,而无需定义新的Func和创建新的Vars,就像我在理想版本2中所做的那样。

p.S.如果您在我的代码中看到任何可疑或不必要的内容,请告诉我!毕竟,我才刚刚开始。对于像
#define HEIGHT dim(0.extent()
这样的宏,有一个警告要小心。因为它们是预处理器中愚蠢的文本替换,所以会发生令人惊讶的愚蠢事情,并导致无法解释的行为和错误消息。这些看起来相当温和,因此您可能需要注意的是
高度
宽度
的其他实例。无论如何,我会用一些小函数来替换它们。编译器可能会将它们内联,因此没有运行时成本,如果出现任何问题,您将受益于sane编译器消息。谢谢!我使用宏的原因是因为Halide已经有了使用列主表示法的函数width()和height(),我想避免与之混淆,我应该使用行主表示法,好吧。但是,您知道是否存在任何默认标识Func吗?或者我必须为我的每一个输入定义一个新的输入吗?请注意,如果您在我的代码中看到任何可疑或不必要的东西,请告诉我!毕竟,我才刚刚开始。对于像
#define HEIGHT dim(0.extent()
这样的宏,有一个警告要小心。因为它们是预处理器中愚蠢的文本替换,所以会发生令人惊讶的愚蠢事情,并导致无法解释的行为和错误消息。这些看起来相当温和,因此您可能需要注意的是
高度
宽度
的其他实例。无论如何,我会用一些小函数来替换它们。编译器可能会将它们内联,因此没有运行时成本,如果出现任何问题,您将受益于sane编译器消息。谢谢!我使用宏的原因是因为Halide已经有了使用列主表示法的函数width()和height(),我想避免与之混淆,我应该使用行主表示法,好吧。但是,您知道是否存在任何默认标识Func吗?还是我必须为每个输入定义一个新的输入?
Halide::Func add(Halide::Func f1, Halide::Func f2, int64_t modulus) {
    //the same definition
}

int main() {
    Halide::Buffer<int64_t> in1(4, 4);
    Halide::Buffer<int64_t> in2(4, 4);
    //initialize in1 and in2 to random numbers

    Halide::Buffer<int64_t> sum(4, 4);
    //h_id is something included in the Halide
    //library which acts as the identity on anything
    sum = add(h_id(in1), h_id(in2), 503).realize(4,4);

    //print the values of sum
}
Halide::Func h_id(Halide::Buffer<int64_t> in) {
    Halide::Var x, y;
    Halide::Func ret;
    ret(x,y) = in(x,y);
    return ret;
}