问题标签 [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.
c++ - 在 Halide 管道中访问 Funcs
我有一个卤化物管道,我想尝试几个时间表。我想通过创建一个带有优化的单独文件来做到这一点,然后在运行时将它们应用于给定的 Func,这样我就可以自动尝试它们以找到最快的。
我开始编写自己的函数来执行此操作,但是对于一些优化,例如 compute_at,这变得相当复杂。compute_at 将 Func 作为第一个参数。有没有一种方法可以访问管道中的 Funcs,而无需保留所有函数的列表,然后将此列表传递给我的函数?我知道由于 Halide 的设计方式,这可能根本不可能。
image - 积分图像框过滤
我正在尝试将 2 遍、可分离的方法与基于积分图像的框过滤方法在 Halide 中的性能进行比较,以更好地理解 Halide 调度。我在 Halide 中找不到任何积分图像创建示例,其中积分图像函数用于后续函数的定义。
我确实在测试中找到了以下代码:
https://github.com/halide/Halide/blob/master/test/correctness/multi_pass_reduction.cpp
但是这个例子使用realize将积分图像计算为一个固定域上的缓冲区,并且没有在后续函数的定义中消耗积分图像的定义作为函数。
当我运行这段代码时,我观察到:
- 积分图像的计算非常慢(将我的管道移动到 0 fps)
- 我得到一个不正确的答案。我觉得我一定是在某种程度上错误定义了我的整体形象
我还有一个相关的问题,在 Halide 的这种场景中,如何最好地安排积分图像的计算?
halide - Halide::Expr' is not contextually convertible to 'bool' -- 将函数的值存储在变量中
我是使用卤化物的新手,我首先在玩实现算法。我正在尝试编写一个函数,该函数取决于它周围 8 个像素的值,要么跳到下一个像素,要么进行一些处理,然后移动到下一个像素。尝试编写此代码时,出现以下编译器错误:
84:5:错误:'Halide::Expr' 类型的值不能在上下文中转换为 'bool'
我已经完成了所有教程,并且已经看到 select 函数是一个选项,但是有没有办法比较函数的值或将它们存储在某个地方?
我也可能认为这个问题是错误的,或者可能没有以正确的“卤化物心态”来实施它,所以任何建议都会很棒。预先感谢您所做的一切!
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.host
值main_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_host
10s。我不确定这种行为是否是预期的,因为方法 1 和 2 基本上都在做同样的事情。
我尝试的下一件事是使用[HalideRuntimeOpenGL.h][3]
纹理并将纹理链接到输入和输出缓冲区,以便能够直接绘制到 OpenGL 上下文,main_file.cpp
而不是保存到 jpeg 文件。但是,我找不到任何示例来弄清楚如何使用其中的函数,HalideRuntimeOpenGL.h
而且我自己尝试的任何事情总是给我运行时错误,我无法弄清楚如何解决。如果有人有任何资源可以指点我,那就太好了。
此外,也欢迎对我上面的代码提供任何反馈。我知道它有效并且正在做我想做的事,但这可能是完全错误的做法,我不会知道更好。
halide - 如何在 Halide 中处理多维数据
我开始与 Halide 合作。我知道它明确是一个图像处理框架,但是有没有一种方法可以在其中处理多维数组( > 3D )而无需执行任何复杂的步骤,例如降维或在低维空间中分离数学方程?
谢谢,卡纳吉特
c++ - 无法计算图像中的 alpha
我尝试使用 Halide 编写简单的图像计算程序。所以我从亮度功能开始。
我懂了
但后来我有一个问题。我的图像是 RGBA 图像,所以我用 alpha 计算算法。如何跳过它,并更改 f(x,y,c) 以使 c 仅为 0-2?
c++ - 如何在卤化物中单独修改颜色通道?
我对修改卤化物像素的单个颜色通道很感兴趣。例如,我怎样才能使红色通道变亮但保持绿色和蓝色通道不变?使所有像素的所有颜色变亮如下所示:
但是当尝试使用以下方法使单个通道变亮时,会收到错误消息。
错误:
那么,如何从像素中读取单个通道值,以及如何修改它们?