私は Halide を使い始めたところです。その設計の基本的な原則は理解できましたが、計算を効率的にスケジュールするために必要な詳細(読み方: 魔法)に苦労しています。
Halide を使用して配列をある場所から別の場所にコピーする MWE を以下に投稿しました。私は、これがほんの一握りの命令にコンパイルされ、実行に 1 マイクロ秒もかからないと想定していました。代わりに、4000 行のアセンブリを生成し、実行に 40 ミリ秒かかります! したがって、明らかに、私の理解には重大な穴があります。
- で既存の配列をラップする標準的な方法は何
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