C++ 卤化物-有没有办法将缓冲区解释为Func?[编辑:自行解决]
我只是想知道在Halide中是否有任何方法可以将缓冲区解释为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
#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;
}