问题标签 [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++ - 卤化物优化调度
我正在尝试为基准卤化物代码制定最佳时间表,但我可能会遗漏一些东西,因为计时结果对我来说没有多大意义。
我正在使用 AOT 编译,这是代码的算法部分:
对于时间表,这就是我所拥有的:
我使用 current_time 函数来计时我的代码的执行。当我对 f1 和 f2 都使用上述时间表时,执行时间比我仅在其中一个 Funcs 上使用时间表时要长。考虑到模板的结构,我认为调度它们会提高性能。我在这里想念什么?此外,当我打印循环以查看生成的代码时:
它只是缩进还是产品 f2 嵌套在产品 f1 中?对更好的时间表有什么建议吗?
llvm - 有没有办法强制 Halide 不生成使用向量指令的代码?
我们已经使用 Halide 语言实现了一些算法,这些算法使用arctan
三角函数。但出于检测目的,我们希望强制 Halide 不生成向量指令。
我们在 Windows 中使用 Visual C++,cl
在 Visual Studio 2013 工具链中使用编译器。到目前为止,试图强制cl
使用/arch:IA32
,但它仍然会生成向量指令。
有没有办法从 Halide 语言方面以某种方式强制执行此操作,或者以任何方式拦截数学库调用,在那里我们可以要求 Halide 使用arctan
我们编写的函数,这些函数未针对使用向量指令进行优化。
halide - 使用卤化物进行优化
我正在使用 Halide 来优化模板计算,但调度部分是一个挑战!这是我的卤化物代码,我正在使用 AOT 编译:
我了解在拆分/平铺和指定每个函数的评估位置时,使用不同的时间表时性能如何变化。但是,我在并行性能方面存在一些问题。我尝试了不同的并行化调度,例如上面的那个。然而,我还没有找到一个有效的并行计划,并且分析数字有点令人困惑。对于上述计划,随着线程数量的增加,“结果”变得更慢,f1_bound 变得更快,而报告为线程的数量(如果我没记错的话是每个区域中活动线程的平均数量)都在增加:
4 个线程:
使用的平均线程数:3.586322堆分配:19500 峰值堆使用量:116640 字节
res:0.946ms (33%) 线程:3.119
f1_b:1.873ms (66%) 线程:3.823 峰值:116640 数量:19500 平均:29160
2 个线程:使用的平均线程数:1.934264
堆分配:19500 峰值堆使用量:58320 字节
res: 0.769ms (19%) 线程: 1.794
f1_b:3.152ms (80%) 线程:1.968 峰值:58320 数量:19500 平均:29160
当我同时安排 f1_bound 和 unbound 时,随着线程数量的增加,我得到了更好的扩展,但我认为局部性较少,因此具有单线程的代码比没有并行化的代码要慢。
对更好的时间表有什么建议吗?
halide - 如何将中间输出保存到多级管道上的图像中?
说我有类似的计算
如何定义 AOT 计划以便我可以保存resultA
和resultB
?和
E(x,y)
的计算是通用的。resultA
resultB
先感谢您
halide - 如何在卤化物运行时处理错误?
在提前编译的情况下,如何让 Halide 抛出可以在更高调用堆栈中处理的异常?例如,当在不正确的位置访问输入图像时。
halide - 生成器可以在开发期间用于 JIT 吗?
HALIDE 的最佳发展策略是什么?最终使用将使用生成器提前编译。有没有办法为 JIT 调用生成器中定义的函数?
谢谢
halide - Halide CUDA GPU SGEMM 实现
我正在尝试构建基于卤化物的图像处理算法,该算法在其中一个阶段需要 SGEMM 功能。
我发现 Halide 有两种矩阵乘法实现:
- 线性代数算法(apps/linear_algebra 文件夹)
- CUDA 矩阵乘法应用程序(apps/cuda_mat_mul 文件夹)
对于大小为 1024x1024 的矩阵:
首先,它们在 CPU (Intel i7) 和 Fermi GPU (GF 540M) 上运行良好,CPU 时间接近 OpenBlas,Fermi GPU 时间接近 cuBlas(约 18 毫秒),但这种实现比 Maxwell 上的 cuBlas 慢 10 倍GPU (TitanX) - 5 毫秒与 0.4 毫秒。与 Fermi 上的 cuBlas 相比,第二个实现 (cuda_mat_mul) 慢 3 倍 - 大约 57 毫秒 vs 18 毫秒,Maxwell GPU 上慢 2 倍 vs cuBlas - 1 毫秒 vs 0.4 毫秒
正如我所见 - Halide 可以为 Fermi GPU 生成最佳代码,但无法在 Maxwell 上快速运行。我知道,SGEMM 函数是许多 FusedMultiplyAdd 并具有正确的调度,但我找不到任何可以使其在 Maxwell 上快速运行的最佳调度。
我能想象的最快的卤化物代码放在 cuda_mat_mul 文件夹中,时间表是:
我也尝试过使用更大的矩阵(2048x2048) - 图片看起来很相似:
- cuBlas时间:0.003174
- 卤化物 linalg SGEMM 时间:0.042568
- 卤化物 cuda_mat_mul 时间:0.006792
基准测试代码来自 apps/cuda_mat_mul/runner.cpp,但将迭代次数从 10 更改为 100 以获得更精确的计时
如何更改时间表以使其与 TitanX 上接近 cuBlas 的性能一起工作?
更新:在 Ubuntu 16.4、LLVM 3.8、Halide 上进行测试——最新来自 git、Cuda 8
halide - 如何命名函数(元组)的多个输出?
假设我有一个用于生成 Ahead of Time 编译函数的生成器,如下所示。
编译成对象和头文件后,生成器的签名如下所示。
如何重命名 myFunction 的输出参数?
result_0_buffer => func1
result_1_buffer => func2
result_2_buffer => func3
谢谢
c - 卤化物与 OpenVX
Halide 和 OpenVX 似乎有相似的目标。
有人可以评论他们的不同之处以及他们在当今社区采用方面的立场吗?