Skip to content

Commit 8896676

Browse files
committed
Refactor operation caller
1 parent 92983d4 commit 8896676

File tree

8 files changed

+508
-420
lines changed

8 files changed

+508
-420
lines changed

modules/cannops/include/opencv2/cann_call.hpp

Lines changed: 71 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -17,44 +17,25 @@ namespace cv
1717
{
1818
namespace cann
1919
{
20-
struct AclAttribute
21-
{
22-
virtual ~AclAttribute() = default;
23-
virtual void addAttr(aclopAttr* opAttr) = 0;
24-
};
25-
26-
#define DEFINE_ATTR_DECLEAR(FUNC, TYPE) \
27-
class Acl##FUNC##Attribute : public AclAttribute \
28-
{ \
29-
const char* name; \
30-
TYPE value; \
31-
\
32-
public: \
33-
Acl##FUNC##Attribute(const char* _name, TYPE _value) : name(_name), value(_value){}; \
34-
void addAttr(aclopAttr* opAttr) CV_OVERRIDE; \
35-
}
36-
37-
#define DEFINE_ATTR_LIST_DECLEAR(FUNC, TYPE) \
38-
class AclList##FUNC##Attribute : public AclAttribute \
39-
{ \
40-
const char* name; \
41-
TYPE value; \
42-
int num; \
43-
\
44-
public: \
45-
AclList##FUNC##Attribute(const char* _name, int _num, TYPE _value) \
46-
: name(_name), value(_value), num(_num){}; \
47-
void addAttr(aclopAttr* opAttr) CV_OVERRIDE; \
48-
}
49-
50-
DEFINE_ATTR_DECLEAR(Float, float);
51-
DEFINE_ATTR_DECLEAR(String, const char*);
52-
DEFINE_ATTR_DECLEAR(Int, int);
53-
DEFINE_ATTR_DECLEAR(Bool, bool);
54-
DEFINE_ATTR_LIST_DECLEAR(Int, int64_t*);
55-
56-
#undef DEFINE_ATTR_DECLEAR
57-
#undef DEFINE_ATTR_LIST_DECLEAR
20+
void aclrtMallocWarpper(void** data, size_t size);
21+
void aclrtFreeWarpper(void* data);
22+
void aclrtMemcpyWarpper(std::shared_ptr<uchar>& dst, size_t offset, const void* src, size_t size,
23+
AscendStream& stream);
24+
void aclrtMemcpyWarpper(void* dst, const std::shared_ptr<uchar>& src, size_t offset, size_t size,
25+
AscendStream& stream);
26+
void aclrtMemcpyWarpper(std::shared_ptr<uchar>& dst, size_t dstOffset,
27+
const std::shared_ptr<uchar>& src, size_t srcOffset, size_t size,
28+
AscendStream& stream);
29+
void aclrtMemcpy2dWarpper(std::shared_ptr<uchar>& dst, size_t offset, size_t dpitch,
30+
const void* src, size_t spitch, size_t width, size_t length,
31+
AscendStream& stream);
32+
void aclrtMemcpy2dWarpper(void* dst, size_t dpitch, const std::shared_ptr<uchar>& src,
33+
size_t offset, size_t spitch, size_t width, size_t length,
34+
AscendStream& stream);
35+
void aclrtMemsetWarpper(std::shared_ptr<uchar>& ptr, int32_t value, size_t count,
36+
AscendStream& stream);
37+
std::shared_ptr<uchar> mallocAndUpload(const void* data, size_t size, AscendStream& stream,
38+
AscendMat::Allocator* allocator);
5839

5940
class AscendStream::Impl
6041
{
@@ -66,6 +47,7 @@ class AscendStream::Impl
6647
explicit Impl(aclrtStream stream);
6748
void AddTensorHolder(const std::shared_ptr<uchar>& tensorData);
6849
};
50+
6951
class AscendEvent::Impl
7052
{
7153
public:
@@ -76,58 +58,72 @@ class AscendEvent::Impl
7658
explicit Impl(aclrtEvent event);
7759
~Impl();
7860
};
61+
7962
struct AscendTensor
8063
{
81-
std::string name;
64+
const char* name;
8265
std::shared_ptr<uchar> data;
8366
size_t dataSize;
8467
std::vector<int64_t> dims;
8568
aclDataType dtype;
8669
aclFormat format;
8770
AscendTensor(){};
8871
AscendTensor(std::shared_ptr<uchar> _data, size_t _dataSize, int64_t* _dims, size_t _dimSize,
89-
aclDataType _dtype, std::string _name = "", aclFormat _format = ACL_FORMAT_ND);
72+
aclDataType _dtype, const char* _name = "", aclFormat _format = ACL_FORMAT_ND);
9073
AscendTensor(std::shared_ptr<uchar> _data, size_t _dataSize, std::vector<int64_t>& _dims,
91-
aclDataType _dtype, std::string _name = "", aclFormat _format = ACL_FORMAT_ND)
74+
aclDataType _dtype, const char* _name = "", aclFormat _format = ACL_FORMAT_ND)
9275
: name(_name), data(_data), dataSize(_dataSize), dims(_dims), dtype(_dtype),
9376
format(_format){};
94-
AscendTensor(const AscendMat& ascendMat, std::string _name = "", aclFormat format = ACL_FORMAT_ND);
77+
AscendTensor(const AscendMat& ascendMat, const char* _name = "",
78+
aclFormat format = ACL_FORMAT_ND);
9579
};
96-
void aclrtMallocWarpper(void** data, size_t size);
97-
void aclrtFreeWarpper(void* data);
9880

99-
void aclrtMemcpyWarpper(std::shared_ptr<uchar>& dst, size_t offset, const void* src, size_t size,
100-
AscendStream& stream);
101-
void aclrtMemcpyWarpper(void* dst, const std::shared_ptr<uchar>& src, size_t offset, size_t size,
102-
AscendStream& stream);
103-
void aclrtMemcpyWarpper(std::shared_ptr<uchar>& dst, size_t dstOffset,
104-
const std::shared_ptr<uchar>& src, size_t srcOffset, size_t size,
105-
AscendStream& stream);
106-
void aclrtMemcpy2dWarpper(std::shared_ptr<uchar>& dst, size_t offset, size_t dpitch,
107-
const void* src, size_t spitch, size_t width, size_t length,
108-
AscendStream& stream);
109-
void aclrtMemcpy2dWarpper(void* dst, size_t dpitch, const std::shared_ptr<uchar>& src,
110-
size_t offset, size_t spitch, size_t width, size_t length,
111-
AscendStream& stream);
112-
void aclrtMemsetWarpper(std::shared_ptr<uchar>& ptr, int32_t value, size_t count,
113-
AscendStream& stream);
81+
class OperatorRunner
82+
{
83+
private:
84+
std::vector<aclDataBuffer*> inputBuffers_;
85+
std::vector<aclDataBuffer*> outputBuffers_;
86+
std::vector<aclTensorDesc*> inputDesc_;
87+
std::vector<aclTensorDesc*> outputDesc_;
88+
aclopAttr* opAttr_;
89+
bool opAttrInit;
90+
std::string op;
91+
92+
std::set<std::shared_ptr<uchar>> holder;
93+
94+
OperatorRunner& addInput(AscendTensor& mat);
95+
OperatorRunner& addOutput(AscendTensor& mat);
96+
97+
public:
98+
OperatorRunner() : opAttrInit(false) {}
99+
virtual ~OperatorRunner() { reset(); }
100+
OperatorRunner& setOp(const char* op);
101+
OperatorRunner& addInput(const AscendMat& mat);
102+
OperatorRunner& addOutput(AscendMat& mat);
103+
OperatorRunner& addAttr(float value, const char* name);
104+
OperatorRunner& addAttr(const char* value, const char* name);
105+
OperatorRunner& addAttr(int value, const char* name);
106+
OperatorRunner& addAttr(bool value, const char* name);
107+
OperatorRunner& addAttr(const int64_t* value, int size, const char* name);
108+
OperatorRunner& addInput(const AscendMat& mat, const char* name);
109+
OperatorRunner& addInput(const Scalar& sc, int type, const char* name);
110+
template <typename T>
111+
OperatorRunner& addInput(const T* value, size_t size, aclDataType type, AscendStream& stream,
112+
const char* name)
113+
{
114+
size_t dataSize = size * sizeof(T);
115+
std::shared_ptr<uchar> axisPtr =
116+
mallocAndUpload(value, dataSize, stream, AscendMat::defaultAllocator());
117+
118+
int64_t dims[] = {(int64_t)size};
119+
AscendTensor tensor(axisPtr, dataSize, dims, 1, type, name);
120+
return addInput(tensor);
121+
}
122+
OperatorRunner& addOutput(AscendMat& mat, const char* name);
123+
OperatorRunner& reset();
124+
OperatorRunner& run(AscendStream& stream);
125+
};
114126

115-
static std::vector<AclAttribute*> emptyattr;
116-
void callAscendOperator(const char* op, std::vector<AscendTensor>& srcs,
117-
std::vector<AscendTensor>& dsts, AscendStream& stream,
118-
std::vector<AclAttribute*>& attrs = emptyattr);
119-
void callAscendOperator(const AscendMat& src, AscendMat& dst, const char* op, AscendStream& stream,
120-
std::vector<AclAttribute*>& attrs = emptyattr);
121-
void callAscendOperator(const AscendMat& src1, const AscendMat& src2, AscendMat& dst, const char* op,
122-
AscendStream& stream, std::vector<AclAttribute*>& attrs = emptyattr);
123-
void callAscendOperator(const AscendMat* srcs, size_t srcCount, AscendMat& dst, const char* op,
124-
AscendStream& stream, std::vector<AclAttribute*>& attrs = emptyattr);
125-
void callAscendOperator(const AscendMat& src, const Scalar& sc, bool inv, AscendMat& dst, const char* op,
126-
AscendStream& stream, std::vector<AclAttribute*>& attrs = emptyattr);
127-
void callAscendOperator(const AscendMat& src, AscendMat* dsts, const size_t dstCount, const char* op,
128-
AscendStream& stream, std::vector<AclAttribute*>& attrs = emptyattr);
129-
std::shared_ptr<uchar> mallocAndUpload(void* data, size_t size, AscendStream& stream,
130-
AscendMat::Allocator* allocator = AscendMat::defaultAllocator());
131127
} // namespace cann
132128
} // namespace cv
133129

modules/cannops/include/opencv2/cann_private.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ namespace cv
1010
{
1111
namespace cann
1212
{
13-
void adds(const AscendMat& arr, float scalar, AscendMat& dst, AscendStream& stream);
14-
void muls(const AscendMat& arr, float scalar, AscendMat& dst, AscendStream& stream);
1513
void transData(const AscendMat& src, AscendMat& dst, const char* from, const char* to,
1614
AscendStream& stream);
1715
void transpose(const AscendMat& src, int64_t* perm, AscendMat& dst, AscendStream& stream);

modules/cannops/src/ascend_mat.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,12 @@ AscendMat& AscendMat::setTo(const Scalar& sc, AscendStream& stream)
185185

186186
AscendMat dst(rows, cols, type());
187187
// TODO use AssignAdd to avoid memcpy, or use broadcase.
188-
callAscendOperator(*this, sc, false, dst, "Add", stream);
188+
OperatorRunner runner;
189+
runner.setOp("Add")
190+
.addInput(*this, "")
191+
.addInput(sc, this->flags, "")
192+
.addOutput(dst, "")
193+
.run(stream);
189194
swap(dst);
190195

191196
return *this;
@@ -202,7 +207,8 @@ AscendMat& AscendMat::setTo(float sc, AscendStream& stream)
202207
aclrtMemsetWarpper(data, 0, totalBytes, stream);
203208

204209
AscendMat dst(rows, cols, type());
205-
adds(*this, sc, dst, stream);
210+
OperatorRunner runner;
211+
runner.setOp("Adds").addInput(*this, "").addOutput(dst, "").addAttr(sc, "value").run(stream);
206212
swap(dst);
207213

208214
return *this;
@@ -213,11 +219,12 @@ void AscendMat::convertTo(AscendMat& dst, int rtype) const
213219
convertTo(dst, rtype, AscendStream::Null());
214220
}
215221

216-
void AscendMat::convertTo(AscendMat& dst, int _rtype, AscendStream& _stream) const
222+
void AscendMat::convertTo(AscendMat& dst, int _rtype, AscendStream& stream) const
217223
{
218224
int cn = channels();
219225
dst.create(rows, cols, CV_MAKE_TYPE(_rtype, cn));
220-
callAscendOperator(*this, dst, "Cast", _stream);
226+
OperatorRunner runner;
227+
runner.setOp("Cast").addInput(*this, "").addOutput(dst, "").run(stream);
221228
}
222229

223230
static AscendMat getAscendMat(InputArray arr)

0 commit comments

Comments
 (0)