问题标签 [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 投票
2 回答
2760 浏览

c++ - 在 C++ 中初始化卤化物缓冲区

我正在尝试使用 C++ 1D 数组初始化卤化物缓冲区。鉴于网上的其他一些帖子,这是我到目前为止所得到的:

其中 in_ptr 是指向我的 C++ 数组的指针。当我运行它时,我收到以下错误:

错误:在 '(' token Image in(Buffer(type_of(), padded_size * (jb + 1), 0, 0, 0, NULL, d_In)) 之前缺少模板参数;

所以我将代码更改为:

Image<float> in(Buffer<float>(type_of<float>(), size_x, 0, 0, 0, NULL, in_ptr));

但这也不匹配任何构造函数,但我找不到任何关于如何初始化缓冲区的好的文档。

甚至有可能做这样的事情吗?如何使用 C++ 1D 或 2D 数组来初始化卤化物缓冲区?

0 投票
1 回答
584 浏览

if-statement - Halide 选择语句的问题

我正在尝试使用卤化物进行一些模板计算。所以假设一个基本的 5 点 2D 模板,要评估单元格 i,j 的某个值,我需要 i-1,j i-2,j, i+1,j i+2,j 的值。现在这在 C++ 中的工作方式是我有一个 for 语句:

现在我正在尝试对 Halide 做同样的事情。所以我有一个 Buffer 被调用,它的值与 C++ 代码中的输入数组相同。我有一个 Func 被调用:

out(i,j) = select(i >= 2 && j >= 2, some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j)) ,0.0f)

当我运行此代码时,我收到以下错误:

错误:输入缓冲区 b0 在 -1 处访问,在维度 0 中的最小值 (0) 之前已中止(核心转储)

根据我的理解,这个错误的原因是 select 语句评估了这两个语句,所以即使我不想计算 i 和 j 小于 2 的任何值,该函数在 i = 0 和 j = 0 时进行评估,因此无效的地址访问。

那么在Halide中有没有这样做呢?if/else 语句还有其他等价物吗?

0 投票
1 回答
127 浏览

halide - 编程形态学开场返回输入

我正在编程形态学打开,它返回的结果与输入图像相同。我误解了它的解释吗?我的代码是:

0 投票
2 回答
1746 浏览

c++ - 如何将 OpenCV Mat 转换为卤化物图像并返回?

我的目标是使用 OpenCV 函数(例如 NL 表示去噪)增强我预先存在的图像处理管道(用 Halide 编写)。OpenCV 函数将无法使用 Halide 的调度功能,因此我的计划是在每个 OpenCV 阶段之前实现每个 Halide Func。剩下的问题是如何最好地从 Halide Image(Func 实现的结果)转换为 OpenCV Mat(作为 OpenCV 函数的输入),并在完成后从 OpenCV Mat 转换为 Halide Image。我的卤化物图像是浮动类型,有 3 个通道。

一个明显的解决方案是编写将数据从一种数据类型复制到另一种数据类型的函数,但这让我觉得很浪费。复制数据不仅需要宝贵的时间,而且还会浪费内存,因为图像将被存储为两种不同的数据类型。有没有办法使用指针或数据缓冲区来简单地以新格式重新包装图像数据?希望这个过程是可逆的,所以我可以从 Halide 转到 OpenCV,然后在 OpenCV 功能完成后返回到 Halide。

0 投票
2 回答
582 浏览

c++ - 如何在 Halide 中使用 C++ 随机函数?

我的目标是能够在卤化物中模拟信号相关的高斯噪声。我有一个在 OpenCV 中构建的模型,我现在正在移植到 Halide。挑战在于 Halide 的随机数生成器不是正态分布的,因此我需要使用外部函数来产生噪声值。

该实现尝试使用 C++ 随机数生成器产生正态分布的噪声,使用 Halide Func 产生每个像素处噪声的信号相关标准偏差,然后将噪声添加到再噪声中的像素中。下面我展示了功能的布局。

这对我来说很有意义,但不幸的是,当我尝试编译时收到以下错误:

所以似乎 Func 的输出不能提供给 C++ 函数。我想这作为卤化物的限制是有道理的,但我并没有真正看到实现信号相关正态分布噪声的替代方案。是否有另一种方法可以在 Halide 中使用外部 C++ 函数?我见过人们谈论使用“extern”,但不幸的是,关于该功能的文档似乎很简单,我无法找到我需要的东西。

0 投票
2 回答
353 浏览

arguments - 卤化物AOT编译

我正在尝试使用 Halide 进行模板计算,它是 C++ 代码的一部分。我使用指向我在 C++ 中定义的数据结构的缓冲区。我想计时我的代码的执行,所以我尝试使用 AOT 编译,以便我可以只计时执行而不是编译时间。那么在使用 AOT 编译时为输入声明类型为 Argument 的向量时,有什么方法可以使用 Buffers 吗?如果没有,是否有其他方法可以在使用 Halide 时确定执行时间?

0 投票
1 回答
843 浏览

c++ - Halide如何自动调整时间表

一段时间以来,我一直在尝试用 Halide 编写代码,而且我总是自己编写时间表。然后我读了这篇论文: http: //graphics.cs.cmu.edu/projects/halidesched/mullapudi16_halidesched.pdf。Soo 据我所知,有一些方法可以生成最佳时间表。我怎么可能做到这一点?

感谢您的回答!

编辑:

你好。我尝试拉分支并用 CMAKE 构建它。但我在用它编译卤化物时遇到问题:

这是 VS 2015 中的错误:

有小费吗?

0 投票
1 回答
222 浏览

halide - 为什么一个系列的最后一个func以halide_copy_to_host开头,以及如何删除它

我有一个创建渐变图像的程序。如果我为我的 GPU 编译它并查看 compile_to_lowered_stmnt 的输出,我会看到它以(在生产语句之后)halide_copy_to_host 开始,然后开始外循环。如果我嵌套函数,halide_copy_to_host 位于同一位置,但对于最外层的函数。请注意,我对调度不做任何事情。我想了解它为什么在那个位置。我希望它在程序结束时将结果复制回主机,而不仅仅是在计算完成之前。如果我希望结果留在 GPU 上(例如输出到屏幕),算法应该在没有副本的情况下运行得更快。有没有办法“删除”halide_copy_to_host?

0 投票
1 回答
346 浏览

halide - Halide中的加权和调度

我在卤化物中实现径向基函数,虽然我成功运行它但速度很慢。对于每个像素,我计算距离,然后取该距离的加权和以产生输出。为了遍历权重,我使用了 RDom(如下所示)。在这个实现中,每个像素计算都需要重新加载所有(3000+)个权重,因此速度很慢。

我的问题是如何在这种情况下利用 Halide 的调度功能。我的愿望是加载一些权重,计算像素子集的部分加权和,加载下一组权重,然后继续完成。这为每个较小的权重组保留了局部性,而这种事情正是 Halide 的目的。不幸的是,我还没有找到任何针对这个特定问题的东西。RDom 似乎比调度原语处于较低的抽象级别,因此不清楚如何调度它。

欢迎任何有关在 Halide 中实现加权和的替代建议。无需使用 RDom 执行此操作,我只是不知道任何其他方式。

0 投票
2 回答
296 浏览

c++ - 卤化物中的 Cholesky 分解

我正在尝试在 Halide 中实现 Cholesky 分解。部分常见算法(如 crout)包括对三角矩阵的迭代。在某种程度上,分解的对角元素是通过从输入矩阵的对角元素中减去部分列和来计算的。列和是在输入矩阵的三角形部分的平方元素上计算的,不包括对角元素。

使用 BLAS,C++ 中的代码如下所示:

我的问题是,Halide 是否可以普遍表达这样的模式?如果是这样,它会是什么样子?