// attachHalide can work both with Halide::Buffer and Halide::Func. In the // second case it will be a fusion. Halide::Func attachHalide(const Halide::Expr& input) { Halide::Func top = (name.empty() ? Halide::Func() : Halide::Func(name)); Halide::Var x("x"), y("y"), c("c"), n("n"); const int numChannels = weights_.total(); auto weights = wrapToHalideBuffer(weights_, {numChannels}); auto bias = wrapToHalideBuffer(bias_, {numChannels}); top(x, y, c, n) = input * weights(c) + bias(c); return top; }
HalideBackendWrapper::HalideBackendWrapper(int targetId, const cv::Mat& m) : BackendWrapper(DNN_BACKEND_HALIDE, targetId) { buffer = wrapToHalideBuffer(m); if (targetId == DNN_TARGET_CPU) { return; } else if (targetId == DNN_TARGET_OPENCL) { buffer.copy_to_device(halide_opencl_device_interface()); } else CV_Error(Error::StsNotImplemented, "Unknown target identifier"); }
HalideBackendWrapper::HalideBackendWrapper(int targetId, const cv::Mat& m) : BackendWrapper(DNN_BACKEND_HALIDE, targetId) { managesDevMemory = true; buffer = wrapToHalideBuffer(m); if (targetId == DNN_TARGET_CPU) { return; } else if (targetId == DNN_TARGET_OPENCL) { Halide::Target t = Halide::get_host_target(); t.set_feature(Halide::Target::OpenCL); buffer.copy_to_device(t); } else CV_Error(Error::StsNotImplemented, "Unknown target identifier"); }
Halide::Buffer<float> wrapToHalideBuffer(const Mat& mat) { return wrapToHalideBuffer(mat, getBufferShape(mat.size)); }
Halide::Buffer<float> wrapToHalideBuffer(const Mat& mat) { int n, c, w, h; getCanonicalSize(mat.size, &w, &h, &c, &n); return wrapToHalideBuffer(mat, {w, h, c, n}); }