问题标签 [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 回答
305 浏览

c++ - 在 Halide 管道中访问 Funcs

我有一个卤化物管道,我想尝试几个时间表。我想通过创建一个带有优化的单独文件来做到这一点,然后在运行时将它们应用于给定的 Func,这样我就可以自动尝试它们以找到最快的。

我开始编写自己的函数来执行此操作,但是对于一些优化,例如 compute_at,这变得相当复杂。compute_at 将 Func 作为第一个参数。有没有一种方法可以访问管道中的 Funcs,而无需保留所有函数的列表,然后将此列表传递给我的函数?我知道由于 Halide 的设计方式,这可能根本不可能。

0 投票
1 回答
847 浏览

image - 积分图像框过滤

我正在尝试将 2 遍、可分离的方法与基于积分图像的框过滤方法在 Halide 中的性能进行比较,以更好地理解 Halide 调度。我在 Halide 中找不到任何积分图像创建示例,其中积分图像函数用于后续函数的定义。

我确实在测试中找到了以下代码:

https://github.com/halide/Halide/blob/master/test/correctness/multi_pass_reduction.cpp

但是这个例子使用realize将积分图像计算为一个固定域上的缓冲区,并且没有在后续函数的定义中消耗积分图像的定义作为函数。

当我运行这段代码时,我观察到:

  1. 积分图像的计算非常慢(将我的管道移动到 0 fps)
  2. 我得到一个不正确的答案。我觉得我一定是在某种程度上错误定义了我的整体形象

我还有一个相关的问题,在 Halide 的这种场景中,如何最好地安排积分图像的计算?

0 投票
2 回答
1086 浏览

halide - Halide::Expr' is not contextually convertible to 'bool' -- 将函数的值存储在变量中

我是使用卤化物的新手,我首先在玩实现算法。我正在尝试编写一个函数,该函数取决于它周围 8 个像素的值,要么跳到下一个像素,要么进行一些处理,然后移动到下一个像素。尝试编写此代码时,出现以下编译器错误:

84:5:错误:'Halide::Expr' 类型的值不能在上下文中转换为 'bool'

我已经完成了所有教程,并且已经看到 select 函数是一个选项,但是有没有办法比较函数的值或将它们存储在某个地方?

我也可能认为这个问题是错误的,或者可能没有以正确的“卤化物心态”来实施它,所以任何建议都会很棒。预先感谢您所做的一切!

0 投票
1 回答
1381 浏览

c++ - 以 GPU (OpenGL) 为目标的 Halide - 基准测试和使用 HalideRuntimeOpenGL.h

我是卤化物的新手。我一直在玩教程以了解该语言。现在,我正在编写一个小型演示应用程序以在 OSX 上从命令行运行。

我的目标是对图像执行逐像素操作,将其安排在 GPU 上并测量性能。我已经尝试了一些我想在这里分享的东西,并对接下来的步骤有一些疑问。

第一种方法

我在 GPU 上安排了算法,目标是 OpenGL,但是因为我无法访问 GPU 内存来写入文件,所以在 Halide 例程中,我通过创建Func cpu_out类似于Halide repo 中的glsl 示例应用程序将输出复制到 CPU

pixel_operation_cpu_out.cpp

因为我编译了这个 AOT,所以我在我的函数中调用main()了它。main()驻留在另一个文件中。

主文件.cpp

注意: Image 此处使用的类与此 Halide示例应用程序中的类相同

这工作得很好,给了我我期望的输出。据我了解,cpu_out使 CPU 内存中的值out可用,这就是为什么我能够通过访问来访问这些output.buf.hostmain_file.cpp

第二种方法:

我尝试的第二件事是不通过创建从设备中的设备复制到主机Func cpu_out,而是copy_to_host使用main_file.cpp.

pixel_operation_gpu_out.cpp

主文件.cpp

所以,现在,我认为正在发生的事情pixel_operation_gpu_out是保持output.buf在 GPU 上,当我这样做copy_to_host时,我将内存复制到 CPU 上。这个程序也给了我预期的输出。

问题:

第二种方法比第一种方法慢得多。不过,慢速部分不在基准测试部分。例如,对于第一种方法,我得到 17 毫秒作为 4k 图像的基准时间。对于同一张图片,在第二种方法中,我得到的基准时间为 22us,所用时间为copy_to_host10s。我不确定这种行为是否是预期的,因为方法 1 和 2 基本上都在做同样的事情。

我尝试的下一件事是使用[HalideRuntimeOpenGL.h][3]纹理并将纹理链接到输入和输出缓冲区,以便能够直接绘制到 OpenGL 上下文,main_file.cpp而不是保存到 jpeg 文件。但是,我找不到任何示例来弄清楚如何使用其中的函数,HalideRuntimeOpenGL.h而且我自己尝试的任何事情总是给我运行时错误,我无法弄清楚如何解决。如果有人有任何资源可以指点我,那就太好了。

此外,也欢迎对我上面的代码提供任何反馈。我知道它有效并且正在做我想做的事,但这可能是完全错误的做法,我不会知道更好。

0 投票
1 回答
178 浏览

halide - 如何在 Halide 中处理多维数据

我开始与 Halide 合作。我知道它明确是一个图像处理框架,但是有没有一种方法可以在其中处理多维数组( > 3D )而无需执行任何复杂的步骤,例如降维或在低维空间中分离数学方程?

谢谢,卡纳吉特

0 投票
1 回答
256 浏览

halide - 日程安排有问题

我试图降低侵蚀函数的执行时间,当我尝试用平铺划分问题时,执行实际上更慢,如图所示:

侵蚀时差

我没有任何调度的代码是:

我的代码尝试平铺(我尝试使用示例,如教程中所示):

任何有关如何正确安排的提示将不胜感激,因为我对此仍然很陌生。

编辑:用于获取时间的代码:

0 投票
2 回答
135 浏览

c++ - 无法计算图像中的 alpha

我尝试使用 Halide 编写简单的图像计算程序。所以我从亮度功能开始。

我懂了

但后来我有一个问题。我的图像是 RGBA 图像,所以我用 alpha 计算算法。如何跳过它,并更改 f(x,y,c) 以使 c 仅为 0-2?

0 投票
1 回答
378 浏览

c++ - 如何在卤化物中单独修改颜色通道?

我对修改卤化物像素的单个颜色通道很感兴趣。例如,我怎样才能使红色通道变亮但保持绿色和蓝色通道不变?使所有像素的所有颜色变亮如下所示:

但是当尝试使用以下方法使单个通道变亮时,会收到错误消息。

错误:

那么,如何从像素中读取单个通道值,以及如何修改它们?

0 投票
2 回答
82 浏览

halide - 无法运行 AOT 代码

我目前正在做 AOT 教程并且编译部分可以工作,但是当我尝试构建包含已编译代码的代码(位于单独的项目中)时,由于以下错误,它无法构建:

在此处输入图像描述

我该如何解决?

编辑:跟进问题。我设法编译了 2 个函数,当我尝试在同一个项目中使用它们时,它不断抛出以下错误:

在此处输入图像描述

这只是其中的几个错误。所以我的后续问题是。我可以将所有函数合并到一个文件中,还是有另一种方法可以忽略双重定义?

0 投票
2 回答
168 浏览

halide - 输出在模板匹配中移动

我正在尝试创建一个模板匹配程序,该程序使用以下公式来确定模板和图像之间的拟合:

公式

我的代码如下:

执行以下代码后,结果图像会像示例中一样移动:

原图:原始图像

模板:模板

结果:结果

如何防止图像移动?