1

私は Halide を使い始めたところです。その設計の基本的な原則は理解できましたが、計算を効率的にスケジュールするために必要な詳細(読み方: 魔法)に苦労しています。

Halide を使用して配列をある場所から別の場所にコピーする MWE を以下に投稿しました。私は、これがほんの一握りの命令にコンパイルされ、実行に 1 マイクロ秒もかからないと想定していました。代わりに、4000 行のアセンブリを生成し、実行に 40 ミリ秒かかります! したがって、明らかに、私の理解には重大な穴があります。

  1. で既存の配列をラップする標準的な方法は何Halide::Imageですか?
  2. コピーを効率的に実行するには、関数をどのよう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
4

2 に答える 2