问题标签 [halide]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
160 浏览

halide - Halide内部错误问题

这是代码。我在 2015 年 8 月 5 日的 Win64 主干 VS2013 上使用 Halide。当我执行 diag.compile_to_lowered_stmt("diag.html", {}, HTML) (使用 16MB 堆栈)时,我收到以下错误消息:

我已经确认由于以下行而发生错误:

我能够删除错误的唯一方法是删除两个选择(当然,在这种情况下该函数不可用。)我尝试将条件转换为 Expr,并且我还检查了类型m45 和 m135(通过将它们分配给 Expr t1,然后查看 t1.type()。)我注意到将“>”更改为“<”甚至 ">=" 不会将错误消息从“ LT”。

有任何想法吗?

代码还是和我之前的帖子一样:

0 投票
1 回答
165 浏览

halide - 意外行为:空循环导致模糊函数的结果得到改善

多年来,我参加了 Siggraph 的一些 Halide 小组讨论,最后我决定进行一些测试,以确定对我现有的软件进行转码是否有用。到目前为止,结果令人印象深刻。

我正在根据 Siggraph 2015 上提供的代码编写高斯模糊,并遇到了一些我无法理解的奇怪行为。我不确定这是我自己的误解还是某种错误/“功能”。

请参见下面的代码,注意空循环。gkernel 和 normalize 是我为生成高斯系数而编写的函数。当我编译并运行注释掉循环的代码时,输​​出图像为黑色(全为零)。当我在函数中留下空循环时,执行得更快,并且输出图像正确模糊。

我错过了一些基本的东西还是这是某种错误?我在 Windows 7 上使用 MSVS Professional 2013。

功能代码:

相关执行代码:

没有无意义循环的结果:

无意义循环的结果:

0 投票
1 回答
428 浏览

c++ - 为 ARM Cortex A9 生成 AOT Halide 目标文件

我正在尝试使用 Halide-lang AOT 和交叉编译教程。我想做的是交叉 AOT 为 Cortex A9 嵌入式 Linux 目标编译一个 Halide 程序。

我修改了 course_11_cross_compilation.cpp 并进行了以下更改:

我使用 course_11_cross_compilation.cpp 文件顶部列出的 g++ 命令编译它。这将生成lession_11 可执行文件。我运行可执行文件并得到一个课程_11_arm_32_linux.h/o 文件。

然后我在该文件上运行我的交叉编译器,以尝试使用以下命令行为我的目标生成一个程序:

/opt/Xilinx/SDK/2014.2/gnu/arm/lin/bin/arm-xilinx-linux-gnueabi-g++ -o test -std=c++11 -lpthread course_10_aot_compilation_run.cpp course_11_arm_32_linux.o -mfpu=neon-vfpv4 /opt/Xilinx/SDK/2014.2/gnu/arm/lin/bin/../lib/gcc/arm-xilinx-linux-gnueabi/4.8.1/../../../../arm- xilinx-linux-gnueabi/bin/ld:错误:lesson_11_arm_32_linux.o 使用 VFP 寄存器参数,测试不 /opt/Xilinx/SDK/2014.2/gnu/arm/lin/bin/../lib/gcc/arm-xilinx -linux-gnueabi/4.8.1/../../../../arm-xilinx-linux-gnueabi/bin/ld:未能合并文件课程_11_arm_32_linux.o collect2的目标特定数据:错误:ld返回1 退出状态

Halide 似乎生成了使用 VFP 的代码。我尝试更改 -mfpu 选项和 -mfloat-abi=softfp、软和硬。没有任何效果。有没有办法配置 Halide 来生成某种类型的 FPU 指令?

0 投票
2 回答
282 浏览

python - 在 GPU 上提前

我正在尝试使用 OpenCL 作为我提前编译的目标。在我的 Halide 内核中,我有一个名为 Func 的函数norm,我编译如下:

然后我编译(并执行以获取norm.onorm.h)没有错误使用

然后我有一个自动生成的(在 Python 中)库包装器,它调用我编译的内核:

然后我得到一个

当我尝试使用ctypesPython 调用我的库时。是否支持 OpenCL AOT 编译,如果支持,知道问题可能是什么吗?

谢谢。

0 投票
1 回答
634 浏览

opencl - 卤化物:在 OpenCL 中使用 constant_exterior() + vectorize()

当我选择带有矢量化调度的 constant_exterior() 类型的边界条件时,我无法使用 Halide 生成 OpenCL 实现。

编译时,我收到以下错误:

我不明白为什么它需要使用布尔向量..

我的函数看起来像这样:

如果我删除.vectorize(x, 4),代码会编译。如果我使用另一个边界条件,假设src = repeat_edge(image, 0, W, 0, H);它也有效。

0 投票
1 回答
392 浏览

image - 从现有的双 C++ 数组创建 Halide::Image 对象

我有一个关于将 Halide::Image 对象包装在已分配的 C++ 数组周围的问题,该数组定义了二维双精度浮点图像。

我已经看过了:

C++ 数组到卤化物图像(和返回)

这与我想要做的很接近,但我对卤化物中 buffer_t 的主机成员的 uint8_t 类型以及如何处理不是 uint8_t 的现有图像感到困惑。

我看到在使用 aot 的模糊应用程序中,该示例分配了一个卤化物图像,然后将元素复制到这个卤化物图像中。我想这样做,但不支付副本费用。

使用 load_image 对我来说不是一个选项,我需要使用由双 * 定义的现有的、已分配的内存。

0 投票
1 回答
165 浏览

halide - 在 Halide 中使用 split() 时可以避免计算相同的元素吗?

我对 Halide 语言中 split() 的行为有疑问。

当我使用 split() 时,当计算区域不是拆分因子的倍数时,它会在边缘计算两次元素。例如,当计算区域为 10 且分割因子为 4 时,Halide 将计算元素 [0,1,2,3]、[4,5,6,7] 和 [6,7,8,9],如下所示下面是 trace_stores() 的结果。

有没有办法在 split() 的内部循环的最后一步只计算元素 [8,9]?

示例代码:

trace_stores() 结果:

0 投票
1 回答
726 浏览

halide - 为什么我的表现不好?(菜鸟调度)

我主要是一个非常高级的程序员,所以考虑 CPU 局部性之类的事情对我来说是非常新的。

我正在研究一个基本的双线性去马赛克(用于 RGGB 传感器数据),并且我的算法是正确的(从结果来看),但它的性能不如我希望的那样(~210Mpix/s)。

这是我的代码(输入是一个 4640x3472 的图像,单通道 RGGB):

老实说,我不知道我在这里做什么,而且我对此太陌生,不知道在哪里或看什么。

关于如何改进日程安排的任何建议都是有帮助的。我仍在学习,但很难找到反馈。

我的时间表是我能做的最好的,但它几乎完全是反复试验。

编辑:我通过直接在函数中进行整个相邻平均求和并在 x_inner 而不是颜色上进行矢量化,从而增加了额外的 30Mpix/s。

编辑:新时间表:

编辑:现在击败(640MP / s)在比我强大两倍的 CPU 上运行的Intel Performance Primitive 基准测试的最终时间表:

0 投票
1 回答
501 浏览

c++ - 卤化物 FFT 实现错误?

我正在尝试运行此处找到的卤化物 FFT 实现,以针对 FTTW 进行基准测试。我能够按原样运行实现,但是在深入挖掘时遇到了一些问题。该例程因 H 和 W 的不同值(随机输入图像的高度和宽度)出现错误而失败。例如,我在 H=W=5 时收到以下错误:

Error at ./fft.cpp:603: Cannot vectorize dimension n0 of function v_S1_R5$6 because the function is scheduled inline. Aborted (core dumped)

我一直在尝试在小图像尺寸(即 5x5)上进行测试以比较算法的结果,但是对于小于 16 的任何值,我都无法完成算法,即使在这一点上也会检查值漫长的任务。FFT 对于大于 32 的值也会失败,似乎不适用于所有非 2 的幂。

有没有人遇到过这个问题?卤化物中是否还有其他适用于不同尺寸图像的 FFT 实现?

作为参考,我正在使用 gcc 4.8.3 在 RHEL7 上运行代码。

0 投票
1 回答
1296 浏览

c++ - Halide - while 循环等效项

我正在尝试在 Halide 中实现 Meijster 距离变换算法。我已经将此代码重写为 C++(使用 openCV)并且运行良好。关于这个算法的论文在这里。现在我的卤化物代码已完成 50% - 第一阶段工作正常,现在我遇到了阶段 2(扫描链接代码中的 3)的问题,它(简化)如下所示:

有没有任何卤化物友好的方法来替换这个while循环?现在我到目前为止唯一的解决方案是这样的(尚未测试):

但即使这可行,halide 很可能会在检查条件之前尝试评估 select 的两个值,并且递归会使其非常慢。

如果没有办法在 Halide 中实现 while 循环,有没有办法只在 Halide 中使用部分代码?还有其他想法吗?