gpt4 book ai didi

c++ - Halide 中的递归 Func 调用

转载 作者:行者123 更新时间:2023-11-30 05:40:13 26 4
gpt4 key购买 nike

我正在使用 Halide 并尝试计算给定二维输入的最大连接单元格的大小。想法是使用递归函数,但我不知道如何用 Halide 语言编写它。

引用python脚本及预期结果如下。

import random

N = 4
data = [[0 for i in range(N)] for j in range(N)]
for index in range(N*N):
data[index/N][index%N] = (random.randint(0,100) & 1)

print "Input"
for d in data:
print d

def ret(x, y):
if x < 0 or y < 0 or x >= N or y >= N:
return 0
if data[y][x] == 0:
return 0

data[y][x] = 0

return ret(x, y-1) + ret(x, y+1) + ret(x-1, y) + ret(x+1, y) + 1

result = [[0 for i in range(N)] for j in range(N)]

for y in range(4):
for x in range(4):
result[y][x] = ret(x, y)

print "Output"
for r in result:
print r


"""
Input
[1, 0, 1, 0]
[0, 0, 1, 1]
[0, 0, 1, 1]
[1, 1, 0, 1]
Output
[1, 0, 6, 0]
[0, 0, 0, 0]
[0, 0, 0, 0]
[2, 0, 0, 0]
"""

Halide 实现在这里,但我收到以下错误消息。

#include "Halide.h"
using namespace Halide;

#define N 6

int main() {

Image<uint8_t> input(N, N);
for(int y = 0; y < N; y++) {
for(int x = 0; x < N; x++) {
input(x, y) = rand() & 1;
printf("%3d", input(x, y));
}
printf("\n");
}
printf("\n");

Var x("x"), y("y");

Func input_f("input_f"), f("f");
input_f(x, y) = input(x, y);

f(x, y) = BoundaryConditions::constant_exterior(input_f, 0, 0, N, 0, N)(x, y);
f(x, y) = select(f(x, y) != 0, f(x-1, y) + f(x+1, y) + f(x, y-1) + f(x, y+1) + 1, 0);

Image<uint8_t> output = f.realize(N, N);
for(int y = 0; y < N; y++) {
for(int x = 0; x < N; x++) {
printf("%3d", output(x, y));
}
printf("\n");
}

return 0;
}

错误信息:

In definition of Func "f":
All of a functions recursive references to itself must contain the same pure variables in the same places as on the left-hand-side.

根据错误信息,我不能在右侧使用'x-1'和'x+1'。但我想这样做。有什么办法可以实现这样的递归Func调用吗?

*如果我能在 Halide 中得到预期的结果,我不会坚持递归调用。

最佳答案

您不能在 Halide 中编写递归调用。也许试试提拉米苏。 http://tiramisu-compiler.org/

关于c++ - Halide 中的递归 Func 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31780426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com