Я начинаю с Halide, и пока я понял основные принципы его дизайна, я борюсь с подробностями (читай: magic) требуется для эффективного расписание вычислений.C++ массив в Halide Image (и обратно)
Я опубликовал ниже MWE с использованием Halide для копирования массива из одного места в другое. Я предположил, что это скомпилирует только до нескольких инструкций и займет менее микросекунды для запуска. Вместо этого он производит 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