Repository for OpenCV's extra modules
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

328 lines
10 KiB

// 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_CANNOPS_CANN_HPP
#define OPENCV_CANNOPS_CANN_HPP
#include "opencv2/core.hpp"
/**
@defgroup cann Ascend-accelerated Computer Vision
@{
@defgroup canncore Core part
@{
@defgroup cann_struct Data Structures
@defgroup cann_init Initializeation and Information
@}
@}
*/
namespace cv
{
namespace cann
{
class AscendStream;
//! @addtogroup cann_struct
//! @{
//===================================================================================
// AscendMat
//===================================================================================
/** @brief Base storage class for NPU memory with reference counting.
* AscendMat class has a similar interface with Mat and AscendMat, and work on [Ascend
* NPU](https://www.hiascend.com/) backend.
* @sa Mat cuda::GpuMat
*/
class AscendStream;
class CV_EXPORTS_W AscendMat
{
public:
class CV_EXPORTS_W Allocator
{
public:
virtual ~Allocator() {}
// basic allocator
virtual std::shared_ptr<uchar> allocate(size_t size) = 0;
// allocator must fill data, step and refcount fields
virtual bool allocate(AscendMat* mat, int rows, int cols, size_t elemSize) = 0;
};
/**
* @brief Create default allocator for AscendMat. This allocator alloc memory from device for
* specific size.
*/
CV_WRAP static AscendMat::Allocator* defaultAllocator();
/**
* @brief Set allocator for AscendMat.
* @param allocator
*/
CV_WRAP static void setDefaultAllocator(AscendMat::Allocator* allocator);
//! default constructor
CV_WRAP explicit AscendMat(AscendMat::Allocator* allocator_ = AscendMat::defaultAllocator());
//! constructs AscendMat of the specified size and type
CV_WRAP AscendMat(int rows, int cols, int type,
AscendMat::Allocator* allocator = AscendMat::defaultAllocator());
//! constructs AscendMat of the specified size and type
CV_WRAP AscendMat(Size size, int type,
AscendMat::Allocator* allocator = AscendMat::defaultAllocator());
//! constructs AscendMat and fills it with the specified value s
CV_WRAP AscendMat(int rows, int cols, int type, Scalar& s,
AscendMat::Allocator* allocator = AscendMat::defaultAllocator());
//! constructs AscendMat and fills it with the specified value s
CV_WRAP AscendMat(Size size, int type, Scalar& s,
AscendMat::Allocator* allocator = AscendMat::defaultAllocator());
//! copy constructor
CV_WRAP AscendMat(const AscendMat& m);
//! constructs AscendMat by crop a certain area from another
CV_WRAP AscendMat(InputArray _m, const Rect& roi);
CV_WRAP AscendMat(InputArray _m, const Rect& roi, AscendStream& stream);
//! builds AscendMat from host memory (Blocking call)
CV_WRAP explicit AscendMat(InputArray arr, AscendStream& stream,
AscendMat::Allocator* allocator = AscendMat::defaultAllocator());
//! assignment operators
AscendMat& operator=(const AscendMat& m);
//! sets some of the AscendMat elements to s (Blocking call)
CV_WRAP AscendMat& setTo(const Scalar& s);
//! sets some of the AscendMat elements to s (Non-Blocking call)
CV_WRAP AscendMat& setTo(const Scalar& s, AscendStream& stream);
//! sets all of the AscendMat elements to float (Blocking call)
CV_WRAP AscendMat& setTo(float sc);
//! sets all of the AscendMat elements to float (Non-Blocking call)
CV_WRAP AscendMat& setTo(float sc, AscendStream& stream);
//! swaps with other smart pointer
CV_WRAP void swap(AscendMat& mat);
//! allocates new AscendMat data unless the AscendMat already has specified size and type
CV_WRAP void create(int rows, int cols, int type);
//! upload host memory data to AscendMat (Blocking call)
CV_WRAP void upload(InputArray arr);
//! upload host memory data to AscendMat (Non-Blocking call)
CV_WRAP void upload(InputArray arr, AscendStream& stream);
//! download data from AscendMat to host (Blocking call)
CV_WRAP void download(OutputArray dst) const;
//! download data from AscendMat to host (Non-Blocking call)
CV_WRAP void download(OutputArray dst, AscendStream& stream) const;
//! converts AscendMat to another datatype (Blocking call)
CV_WRAP void convertTo(CV_OUT AscendMat& dst, int rtype) const;
//! converts AscendMat to another datatype (Non-Blocking call)
CV_WRAP void convertTo(CV_OUT AscendMat& dst, int rtype, AscendStream& stream) const;
//! converts AscendMat to another datatype, dst mat is allocated. (Non-Blocking call)
CV_WRAP void convertTo(CV_OUT AscendMat& dst, AscendStream& stream) const;
//! returns true iff the AscendMat data is continuous
//! (i.e. when there are no gaps between successive rows)
CV_WRAP bool isContinuous() const;
//! returns element size in bytes
CV_WRAP size_t elemSize() const;
//! returns the size of element channel in bytes
CV_WRAP size_t elemSize1() const;
//! returns element type
CV_WRAP int type() const;
//! returns element type
CV_WRAP int depth() const;
//! returns number of channels
CV_WRAP int channels() const;
//! returns step/elemSize1()
CV_WRAP size_t step1() const;
//! returns AscendMat size : width == number of columns, height == number of rows
CV_WRAP Size size() const;
//! returns true if AscendMat data is NULL
CV_WRAP bool empty() const;
//! internal use method: updates the continuity flag
CV_WRAP void updateContinuityFlag();
/*! includes several bit-fields:
- the magic signature
- continuity flag
- depth
- number of channels
*/
int flags;
//! the number of rows and columns
int rows, cols;
//! a distance between successive rows in bytes; includes the gap if any
CV_PROP size_t step;
//! pointer to the data
std::shared_ptr<uchar> data;
//! helper fields used in locateROI and adjustROI
uchar* datastart;
const uchar* dataend;
//! allocator
Allocator* allocator;
};
class AscendStream;
class AscendStreamAccessor;
class AscendEvent;
class AscendEventAccessor;
class DefaultDeviceInitializer;
//===================================================================================
// AscendStream
//===================================================================================
/** @brief In AscendCL Stream(AscendStream) is a task queue. Stream is used to manage the
* parallelism of tasks. The tasks inside a Stream are executed sequentially, that is, the Stream
* executes sequentially according to the sent tasks; the tasks in different Streams are executed in
* parallel.
*
* All Non-blocking functions should pass parameter stream, These function returns immediately after
* the task is submitted. Caller should wait stream until completion.
*
* Blocking functions implicityly use the default stream, and synchronize stream before function
* return.
* @sa cuda::Stream
*/
// TODO: Stream is defined in namespace cuda, and pybind code does not use a namespace of stream,
// change stream name to AscendStream to avoid confilct.
class CV_EXPORTS_W AscendStream
{
public:
CV_WRAP AscendStream();
//! blocks the current CPU thread until all operations in the stream are complete.
CV_WRAP void waitForCompletion();
//! blocks the current CPU thread until event trigger.
CV_WRAP void waitAscendEvent(const cv::cann::AscendEvent& event);
/**
* @brief return default AscendStream object for default Acl stream.
*/
CV_WRAP static AscendStream& Null();
// acl symbols CANNOT used in any hpp files. Use a inner class to avoid acl symbols defined in
// hpp.
class Impl;
void addTensorHolder(const std::shared_ptr<uchar>& holder);
private:
Ptr<Impl> impl_;
AscendStream(const Ptr<Impl>& impl);
friend class AscendStreamAccessor;
friend class DefaultDeviceInitializer;
};
/**
* @brief AscendEvent to synchronize between different streams.
*/
class CV_EXPORTS_W AscendEvent
{
public:
CV_WRAP AscendEvent();
//! records an event
CV_WRAP void record(AscendStream& stream);
//! waits for an event to complete
CV_WRAP void waitForComplete() const;
class Impl;
private:
Ptr<Impl> impl_;
AscendEvent(const Ptr<Impl>& impl);
friend class AscendEventAccessor;
};
/** @brief Bindings overload to create a Stream object from the address stored in an existing CANN
* Runtime API stream pointer (aclrtStream).
* @param AscendStreamAddress Memory address stored in a CANN Runtime API stream pointer
* (aclrtStream). The created Stream object does not perform any allocation or deallocation and
* simply wraps existing raw CANN Runtime API stream pointer.
* @note Overload for generation of bindings only, not exported or intended for use internally fro
* C++.
*/
CV_EXPORTS_W AscendStream wrapStream(size_t AscendStreamAddress);
//! @} cann_struct
//===================================================================================
// Initialization & Info
//===================================================================================
//! @addtogroup cann_init
//! @{
//! Get Ascend matrix object from Input array, upload matrix memory if need. (Non-Blocking call)
AscendMat getInputMat(InputArray src, AscendStream& stream);
//! Get Ascend matrix object from Output array, upload matrix memory if need.
AscendMat getOutputMat(OutputArray dst, int rows, int cols, int type, AscendStream& stream);
//! Sync output matrix to Output array, download matrix memory if need.
void syncOutput(const AscendMat& dst, OutputArray _dst, AscendStream& stream);
/**
* @brief Choose Ascend npu device.
*/
CV_EXPORTS_W void setDevice(int device);
/**
* @brief Clear all context created in current Ascend device.
*/
CV_EXPORTS_W void resetDevice();
/**
* @brief Get current Ascend device.
*/
CV_EXPORTS_W int32_t getDevice();
/**
* @brief init AscendCL.
*/
CV_EXPORTS_W void initAcl();
/**
* @brief finalize AscendCL.
* @note finalizeAcl only can be called once for a process. Call this function after all AscendCL
* options finished.
*/
CV_EXPORTS_W void finalizeAcl();
//! @} cann_init
} // namespace cann
} // namespace cv
#include "opencv2/cann.inl.hpp"
#endif // OPENCV_CANNOPS_CANN_HPP