问题标签 [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 编程语言入门?
我正在尝试使用名为Halide的图像处理领域特定语言(C++ 扩展)。
在Halide README之后,这是我尝试过的:
- 下载了Ubuntu 12.04 Halide 二进制文件,并解压到一个名为
~/halide
. - 在该
~/halide
目录中,我创建了hello_halide.cpp
,如本页Using Halide
部分所述。 试图编译
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
尝试添加
~/halide
到我的$PATH
and$LD_LIBRARY_PATH
,但这没有帮助。
如何编译这个基本hello_halide.cpp
的卤化物程序?
笔记:
- CUDA 是 Halide 的依赖项之一。我已经安装了 CUDA,我可以编译/运行 CUDA 程序。
- 我正在使用 Ubuntu 12.04。
- 我的 g++ 版本是 4.6.3。
image-processing - 推荐的分发卤化物生成函数的方法?
我目前正在试验Halide,最初的测试显示出相当有希望的性能改进。
我现在想知道分发卤化物代码的最佳策略是什么。目前,要求用户安装 Halide 似乎是一个沉重的障碍(因为没有自动安装选项)。
一种选择是使用compile_to_c
,将生成的 C 代码添加到存储库中,然后分发此类 C 代码的编译脚本。scikit-learn对 Cython 生成的代码使用了类似的策略。对于 Halide 来说,这似乎是不行的,因为生成的 C 代码失去了所有的优化,违背了 Halide 的目的。
我目前的想法是使用
compile_to_bitcode ,将生成的位码与调用llc的编译脚本一起分发以生成所需的机器代码。对用户的唯一要求是安装llc
(即llvm
)。
有没有人有这个问题的经验?
我分发比特码的想法的优缺点是什么?
你会推荐什么?
c++ - 卤化物元组用法
我想使用 Halide 生成多个输出缓冲区。
这个例子工作正常,但我想知道是否可以有多个输出,但大小不同,例如:
我从 Halide 收到关于输出 0 和输出 1 之间差异的错误。
我假设我只想要一个编译(compile_to_file),而不是多个目标文件。
周杰伦
c++ - 卤化物外部方法
我使用 AOT 编译来使用没有卤化物库的卤化物代码。
我在 HalideRuntime.h (可在来源中获得)中看到我的 .o 文件中有许多可用的外部方法。
halide_dev_malloc和halide_dev_free非常有趣。我已经毫无问题地使用了 halide_copy_to_dev,但我看到我的内存已分配。如果我想在主机和设备之间做一个简单的 memcpy 并改用 halide_dev_malloc,这可能吗?
HalideRuntime.h 是否对所有可用的外部函数进行了分组,或者目标文件是否包含许多其他函数?
周杰伦
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
卤化物内部:
外卤化物(外部功能):
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
windows - 在 Windows 上使用卤化物?
我的问题:如何让 Halide 在 Windows 环境中工作?我一直找不到任何真正的 windows 文档(我期望的“粗糙边缘”的一部分)。
我的情况:我正在尝试在跨平台(windows、mac、android)情况下使用 Halide,但在 VS2013 中使用它时遇到了很多麻烦。使用预构建的二进制文件,一切运行和编译都很好,但是当我尝试实际运行程序时,该行
在 Halide.DLL 中引发 std::bad_alloc 异常。我开始怀疑可能是 Halide windows 二进制文件是为与 MinGW 工具链或其他一些非 msvc 解决方案一起使用而编译的,而我的问题源于此。有任何想法吗?
更新:我现在可以运行而不会遇到这个问题,但只能在发布版本中运行。定义 _DEBUG 和/或与 /MDd 链接会导致崩溃。
operator-keyword - 如何使用卤化物运算符 ==
我是 Halide 的新手,我正在尝试将 RGB 图像转换为 HSV 格式。算法如下
所以我这样写代码:
当我尝试编译代码时,它会报告如下错误:
谁能告诉我出了什么问题以及如何解决?
python - 更改卤化物输出缓冲区布局
我正在尝试更改实现的缓冲区布局。我了解 Halide 的目的是允许“一次”定义算法,然后能够分别更改计划和存储布局等内容。
我已经尝试my_output_function.reorder_storage(x,y,c)
(和排列x,y,c
);然而对于任何存储顺序,实现缓冲区的步幅保持不变(即布局不会改变)。
如果我在调用时更改尺寸顺序my_output_function.realize(width, height, channels)
,则代码不会编译,因为违反了某些边界条件。我需要更改算法定义,破坏卤化物的目的。
我应该怎么做才能改变输出布局?为什么不reorder_storage
影响输出?
谢谢你的帮助。
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 为目标,该函数是否在内核中?