我开始使用 Halide,虽然我已经掌握了它设计的基本原则,但我正在努力解决有效安排计算所需的细节(阅读:魔法) 。
我在使用 Halide 将数组从一个位置复制到另一个位置的 MWE 下方发布。我曾假设这将编译成只有少数指令,并且运行时间不到一微秒。相反,它产生了 4000 条装配线,运行时间为 40 毫秒!因此,很明显,我的理解存在重大漏洞。
- 将现有数组包装在 a 中的规范方法是
Halide::Image
什么? - 应该如何安排函数
copy
以有效地执行复制?
最小的工作示例
#include <Halide.h>
using namespace Halide;
void _copy(uint8_t* in_ptr, uint8_t* out_ptr, const int M, const int N) {
Image<uint8_t> in(Buffer(UInt(8), N, M, 0, 0, in_ptr));
Image<uint8_t> out(Buffer(UInt(8), N, M, 0, 0, out_ptr));
Var x,y;
Func copy;
copy(x,y) = in(x,y);
copy.realize(out);
}
int main(void) {
uint8_t in[10000], out[10000];
_copy(in, out, 100, 100);
}
编译标志
clang++ -O3 -march=native -std=c++11 -Iinclude -Lbin -lHalide copy.cpp