// This file is part of OpenCV project. // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html. #ifndef OPENCV_DNN_SRC_CUDA4DNN_PRIMITIVES_SLICE_HPP #define OPENCV_DNN_SRC_CUDA4DNN_PRIMITIVES_SLICE_HPP #include "../../op_cuda.hpp" #include "../csl/stream.hpp" #include "../kernels/slice.hpp" #include "../kernels/fill_copy.hpp" #include #include #include #include #include namespace cv { namespace dnn { namespace cuda4dnn { template class SliceOp final : public CUDABackendNode { public: using wrapper_type = GetCUDABackendWrapperType; /* offsets is indexed by output number and each subvector is indexed by axis number */ SliceOp(csl::Stream stream_, std::vector> offsets) : stream(std::move(stream_)), offsets(std::move(offsets)) { } void forward( const std::vector>& inputs, const std::vector>& outputs, csl::Workspace& workspace) override { /* sometimes the output shape is passed in the form of a second input tensor * it's only required for initialization and not here */ CV_Assert(inputs.size() == 1 || inputs.size() == 2); auto input_wrapper = inputs[0].dynamicCast(); auto input = input_wrapper->getView(); CV_Assert(offsets.size() == outputs.size()); for (int i = 0; i < outputs.size(); ++i) { auto output_wrapper = outputs[i].dynamicCast(); auto output = output_wrapper->getSpan(); kernels::slice(stream, output, input, offsets[i]); } } private: csl::Stream stream; std::vector> offsets; }; }}} /* namespace cv::dnn::cuda4dnn */ #endif /* OPENCV_DNN_SRC_CUDA4DNN_PRIMITIVES_SLICE_HPP */