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

c++ - Halide 编程语言入门?

我正在尝试使用名为Halide的图像处理领域特定语言(C++ 扩展)

Halide README之后,这是我尝试过的:

  1. 下载了Ubuntu 12.04 Halide 二进制文件,并解压到一个名为~/halide.
  2. 在该~/halide目录中,我创建了hello_halide.cpp,如本页Using Halide部分所述。
  3. 试图编译hello_halide.cpp

    g++-4.6 -std=c++0x hello_halide.cpp -L halide -lHalide -ldl -lpthread -o hello_halide

    但是,g++ 找不到 libhalide:

    /usr/bin/ld: error: cannot find -lHalide

  4. 尝试添加~/halide到我的$PATHand $LD_LIBRARY_PATH,但这没有帮助。

如何编译这个基本hello_halide.cpp的卤化物程序?


笔记:

  • CUDA 是 Halide 的依赖项之一。我已经安装了 CUDA,我可以编译/运行 CUDA 程序。
  • 我正在使用 Ubuntu 12.04。
  • 我的 g++ 版本是 4.6.3。
0 投票
2 回答
958 浏览

image-processing - 推荐的分发卤化物生成函数的方法?

我目前正在试验Halide,最初的测试显示出相当有希望的性能改进。

我现在想知道分发卤化物代码的最佳策略是什么。目前,要求用户安装 Halide 似乎是一个沉重的障碍(因为没有自动安装选项)。

一种选择是使用compile_to_c,将生成的 C 代码添加到存储库中,然后分发此类 C 代码的编译脚本。scikit-learn对 Cython 生成的代码使用了类似的策略。对于 Halide 来说,这似乎是不行的,因为生成的 C 代码失去了所有的优化,违背了 Halide 的目的。

我目前的想法是使用 compile_to_bitcode ,将生成的位码与调用llc的编译脚本一起分发以生成所需的机器代码。对用户的唯一要求是安装llc(即llvm)。

有没有人有这个问题的经验?
我分发比特码的想法的优缺点是什么?
你会推荐什么?

0 投票
1 回答
496 浏览

c++ - 卤化物元组用法

我想使用 Halide 生成多个输出缓冲区。

这个例子工作正常,但我想知道是否可以有多个输出,但大小不同,例如:

我从 Halide 收到关于输出 0 和输出 1 之间差异的错误。

我假设我只想要一个编译(compile_to_file),而不是多个目标文件。

周杰伦

0 投票
2 回答
347 浏览

c++ - 卤化物外部方法

我使用 AOT 编译来使用没有卤化物库的卤化物代码。

我在 HalideRuntime.h (可在来源中获得)中看到我的 .o 文件中有许多可用的外部方法。

halide_dev_mallochalide_dev_free非常有趣。我已经毫无问题地使用了 halide_copy_to_dev,但我看到我的内存已分配。如果我想在主机和设备之间做一个简单的 memcpy 并改用 halide_dev_malloc,这可能吗?

HalideRuntime.h 是否对所有可用的外部函数进行了分组,或者目标文件是否包含许多其他函数?

周杰伦

0 投票
2 回答
1738 浏览

c++ - 在带有 GPU 的 Halide 上使用 extern

我尝试在 Halide 中使用 extern 函数。在我的上下文中,我想在 GPU 上进行。

我用 opencl 语句在 AOT 编译中编译。当然opencl还是可以用cpu的,所以我用这个:

现在,一切都安排在 compute_root() 中。

第一个问题,如果我使用 compute_root() 和 OpenCL gpu,我的进程是否会在设备上使用 CopyHtoD 和 DtoH 进行计算?(或者它将在主机缓冲区上)

第二个问题,更多与外部函数有关。我们使用一些外部调用,因为我们的一些算法不在 Halide 中。外呼:

外部检索:外部“C” int cool_foo(buffer_t * in, int w, int h, int z, buffer_t * out){ .. }

但是,在cool_foo 函数中,我的buffer_t 只加载到主机内存中。开发地址为 0(默认)。

如果我尝试在算法之前复制内存:

它什么也不做。

如果我只提供设备内存:

我的主机指针为空,但设备地址仍为 0。

(在我的情况下,dev_dirty 为 true,host_dirty 为 false)

任何想法?

编辑(回答 dsharlet)

这是我的代码的结构:

在 CPU 上正确解析数据。--> 在 GPU 上发送缓冲区(使用 halide_copy_to_dev...) --> 进入 Halide 结构,读取参数并添加边界条件 --> 进入我的 extern 函数 -->...

我的 extern 函数中没有有效的 buffer_t。我在 compute_root() 中安排所有内容,但使用 HL_TARGET=host-opencl 并将 ocl 设置为 gpu。在进入Halide之前,我可以读取我的设备地址,就可以了。

这是我的代码:

在 Halide 之前,一切都是 CPU 的东西(指针),我们将它转​​移到 GPU

卤化物内部:

外卤化物(外部功能):

0 投票
2 回答
540 浏览

ios - 你如何为 iOS 编译 Halide?

自述文件声称它可以编译为 armv7,但我找不到让它工作的魔法咒语。

我开始尝试更改 Makefile 以设置 arch=armv7、修复生成的编译错误等,但这似乎不是正确的方法。

推荐的 cmake 标志是:

但是很可惜,bin 目录只包含一个 .a 和一个 .so,它们都是为 x86_64 编译的。没有动态库。

我可以在模拟器中成功运行测试 iOS 应用程序,并与 x86 库链接,但我无法在设备上构建,因为没有 arm 二进制文件。

这是我正在尝试构建的卤化物测试应用程序的链接: https ://github.com/halide/Halide/tree/master/apps/HelloiOS

0 投票
2 回答
2045 浏览

windows - 在 Windows 上使用卤化物?

我的问题:如何让 Halide 在 Windows 环境中工作?我一直找不到任何真正的 windows 文档(我期望的“粗糙边缘”的一部分)。

我的情况:我正在尝试在跨平台(windows、mac、android)情况下使用 Halide,但在 VS2013 中使用它时遇到了很多麻烦。使用预构建的二进制文件,一切运行和编译都很好,但是当我尝试实际运行程序时,该行

在 Halide.DLL 中引发 std::bad_alloc 异常。我开始怀疑可能是 Halide windows 二进制文件是为与 MinGW 工具链或其他一些非 msvc 解决方案一起使用而编译的,而我的问题源于此。有任何想法吗?

更新:我现在可以运行而不会遇到这个问题,但只能在发布版本中运行。定义 _DEBUG 和/或与 /MDd 链接会导致崩溃。

0 投票
1 回答
550 浏览

operator-keyword - 如何使用卤化物运算符 ==

我是 Halide 的新手,我正在尝试将 RGB 图像转换为 HSV 格式。算法如下

所以我这样写代码:

当我尝试编译代码时,它会报告如下错误:

谁能告诉我出了什么问题以及如何解决?

0 投票
1 回答
886 浏览

python - 更改卤化物输出缓冲区布局

我正在尝试更改实现的缓冲区布局。我了解 Halide 的目的是允许“一次”定义算法,然后能够分别更改计划和存储布局等内容。

我已经尝试my_output_function.reorder_storage(x,y,c)(和排列x,y,c);然而对于任何存储顺序,实现缓冲区的步幅保持不变(即布局不会改变)。

如果我在调用时更改尺寸顺序my_output_function.realize(width, height, channels),则代码不会编译,因为违反了某些边界条件。我需要更改算法定义,破坏卤化物的目的。

我应该怎么做才能改变输出布局?为什么不reorder_storage影响输出?

谢谢你的帮助。

0 投票
1 回答
1692 浏览

halide - Halide:OpenCL 代码生成

是否可以在 Halide 中生成包含生成的 OpenCL 代码的文件?我试图从一个目标是 opencl 的 Halide 程序生成 ac 文件,但我在那里看不到任何 opencl 特定代码。

编辑1:

我特别想看看如何在 Halide 中创建内核。像这样的东西:

static char kernelSourceCode[] = kernel void test_kernel(int a, int b, __global int *out) { out[0] = a + b; }

编辑2:

好的,我将 HL_DEBUG_CODEGEN=1 放入环境变量并在代码 set_target(Target::Debug) 中设置。我在屏幕上看到一堆代码,其中一些是 OpenCL 代码,但我仍然看不到任何内核特定代码。

屏幕上有两行表示内核。应该有什么吗?

OpenCL kernel: /*OpenCL C*/

然后还有一行:

kernel void _at_least_one_kernel(int x) { }

例如,如果我有这样的功能:

gradient(x, y) = x + y;

如果我想以 OpenCL 为目标,该函数是否在内核中?