|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707 |
- // Copyright 2017 Tencent
- // SPDX-License-Identifier: BSD-3-Clause
-
- #include "mat.h"
-
- #include "layer.h"
- #include "layer_type.h"
-
- #if NCNN_VULKAN
- #if NCNN_PLATFORM_API
- #if __ANDROID_API__ >= 26
- #include <android/hardware_buffer.h>
- #endif // __ANDROID_API__ >= 26
- #endif // NCNN_PLATFORM_API
- #endif // NCNN_VULKAN
-
- namespace ncnn {
-
- Mat Mat::clone(Allocator* _allocator) const
- {
- if (empty())
- return Mat();
-
- Mat m;
- if (dims == 1)
- m.create(w, elemsize, elempack, _allocator);
- else if (dims == 2)
- m.create(w, h, elemsize, elempack, _allocator);
- else if (dims == 3)
- m.create(w, h, c, elemsize, elempack, _allocator);
- else if (dims == 4)
- m.create(w, h, d, c, elemsize, elempack, _allocator);
-
- if (m.empty())
- return m;
-
- if (total() > 0)
- {
- if (cstep == m.cstep)
- memcpy(m.data, data, total() * elemsize);
- else
- {
- // copy by channel for differnet cstep
- size_t size = (size_t)w * h * d * elemsize;
- for (int i = 0; i < c; i++)
- {
- memcpy(m.channel(i), channel(i), size);
- }
- }
- }
-
- return m;
- }
-
- void Mat::clone_from(const ncnn::Mat& mat, Allocator* allocator)
- {
- *this = mat.clone(allocator);
- }
-
- Mat Mat::reshape(int _w, Allocator* _allocator) const
- {
- if (w * h * d * c != _w)
- return Mat();
-
- if (dims >= 3 && cstep != (size_t)w * h * d)
- {
- Mat m;
- m.create(_w, elemsize, elempack, _allocator);
- if (m.empty())
- return m;
-
- // flatten
- for (int i = 0; i < c; i++)
- {
- const void* ptr = (unsigned char*)data + i * cstep * elemsize;
- void* mptr = (unsigned char*)m.data + i * (size_t)w * h * d * elemsize;
- memcpy(mptr, ptr, (size_t)w * h * d * elemsize);
- }
-
- return m;
- }
-
- Mat m = *this;
-
- m.dims = 1;
- m.w = _w;
- m.h = 1;
- m.d = 1;
- m.c = 1;
-
- m.cstep = alignSize(_w * elemsize, 16) / elemsize;
-
- return m;
- }
-
- Mat Mat::reshape(int _w, int _h, Allocator* _allocator) const
- {
- if (w * h * d * c != _w * _h)
- return Mat();
-
- if (dims >= 3 && cstep != (size_t)w * h * d)
- {
- Mat m;
- m.create(_w, _h, elemsize, elempack, _allocator);
- if (m.empty())
- return m;
-
- // flatten
- for (int i = 0; i < c; i++)
- {
- const void* ptr = (unsigned char*)data + i * cstep * elemsize;
- void* mptr = (unsigned char*)m.data + i * (size_t)w * h * d * elemsize;
- memcpy(mptr, ptr, (size_t)w * h * d * elemsize);
- }
-
- return m;
- }
-
- Mat m = *this;
-
- m.dims = 2;
- m.w = _w;
- m.h = _h;
- m.d = 1;
- m.c = 1;
-
- m.cstep = alignSize((size_t)_w * _h * elemsize, 16) / elemsize;
-
- return m;
- }
-
- Mat Mat::reshape(int _w, int _h, int _c, Allocator* _allocator) const
- {
- if (w * h * d * c != _w * _h * _c)
- return Mat();
-
- if (dims < 3)
- {
- if ((size_t)_w * _h != alignSize((size_t)_w * _h * elemsize, 16) / elemsize)
- {
- Mat m;
- m.create(_w, _h, _c, elemsize, elempack, _allocator);
- if (m.empty())
- return m;
-
- // align channel
- for (int i = 0; i < _c; i++)
- {
- const void* ptr = (unsigned char*)data + i * (size_t)_w * _h * elemsize;
- void* mptr = (unsigned char*)m.data + i * m.cstep * m.elemsize;
- memcpy(mptr, ptr, (size_t)_w * _h * elemsize);
- }
-
- return m;
- }
- }
- else if (c != _c)
- {
- // flatten and then align
- Mat tmp = reshape(_w * _h * _c, _allocator);
- return tmp.reshape(_w, _h, _c, _allocator);
- }
-
- Mat m = *this;
-
- m.dims = 3;
- m.w = _w;
- m.h = _h;
- m.d = 1;
- m.c = _c;
-
- m.cstep = alignSize((size_t)_w * _h * elemsize, 16) / elemsize;
-
- return m;
- }
-
- Mat Mat::reshape(int _w, int _h, int _d, int _c, Allocator* _allocator) const
- {
- if (w * h * d * c != _w * _h * _d * _c)
- return Mat();
-
- if (dims < 3)
- {
- if ((size_t)_w * _h * _d != alignSize((size_t)_w * _h * _d * elemsize, 16) / elemsize)
- {
- Mat m;
- m.create(_w, _h, _d, _c, elemsize, elempack, _allocator);
- if (m.empty())
- return m;
-
- // align channel
- for (int i = 0; i < _c; i++)
- {
- const void* ptr = (unsigned char*)data + i * (size_t)_w * _h * _d * elemsize;
- void* mptr = (unsigned char*)m.data + i * m.cstep * m.elemsize;
- memcpy(mptr, ptr, (size_t)_w * _h * _d * elemsize);
- }
-
- return m;
- }
- }
- else if (c != _c)
- {
- // flatten and then align
- Mat tmp = reshape(_w * _h * _d * _c, _allocator);
- return tmp.reshape(_w, _h, _d, _c, _allocator);
- }
-
- Mat m = *this;
-
- m.dims = 4;
- m.w = _w;
- m.h = _h;
- m.d = _d;
- m.c = _c;
-
- m.cstep = alignSize((size_t)_w * _h * _d * elemsize, 16) / elemsize;
-
- return m;
- }
-
- void Mat::create(int _w, size_t _elemsize, Allocator* _allocator)
- {
- if (dims == 1 && w == _w && elemsize == _elemsize && elempack == 1 && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = 1;
- allocator = _allocator;
-
- dims = 1;
- w = _w;
- h = 1;
- d = 1;
- c = 1;
-
- cstep = alignSize(w * elemsize, 16) / elemsize;
-
- size_t totalsize = alignSize(total() * elemsize, 4);
- if (totalsize > 0)
- {
- if (allocator)
- data = allocator->fastMalloc(totalsize + (int)sizeof(*refcount));
- else
- data = fastMalloc(totalsize + (int)sizeof(*refcount));
- }
-
- if (data)
- {
- refcount = (int*)(((unsigned char*)data) + totalsize);
- *refcount = 1;
- }
- }
-
- void Mat::create(int _w, int _h, size_t _elemsize, Allocator* _allocator)
- {
- if (dims == 2 && w == _w && h == _h && elemsize == _elemsize && elempack == 1 && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = 1;
- allocator = _allocator;
-
- dims = 2;
- w = _w;
- h = _h;
- d = 1;
- c = 1;
-
- cstep = alignSize((size_t)w * h * elemsize, 16) / elemsize;
-
- size_t totalsize = alignSize(total() * elemsize, 4);
- if (totalsize > 0)
- {
- if (allocator)
- data = allocator->fastMalloc(totalsize + (int)sizeof(*refcount));
- else
- data = fastMalloc(totalsize + (int)sizeof(*refcount));
- }
-
- if (data)
- {
- refcount = (int*)(((unsigned char*)data) + totalsize);
- *refcount = 1;
- }
- }
-
- void Mat::create(int _w, int _h, int _c, size_t _elemsize, Allocator* _allocator)
- {
- if (dims == 3 && w == _w && h == _h && c == _c && elemsize == _elemsize && elempack == 1 && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = 1;
- allocator = _allocator;
-
- dims = 3;
- w = _w;
- h = _h;
- d = 1;
- c = _c;
-
- cstep = alignSize((size_t)w * h * elemsize, 16) / elemsize;
-
- size_t totalsize = alignSize(total() * elemsize, 4);
- if (totalsize > 0)
- {
- if (allocator)
- data = allocator->fastMalloc(totalsize + (int)sizeof(*refcount));
- else
- data = fastMalloc(totalsize + (int)sizeof(*refcount));
- }
-
- if (data)
- {
- refcount = (int*)(((unsigned char*)data) + totalsize);
- *refcount = 1;
- }
- }
-
- void Mat::create(int _w, int _h, int _d, int _c, size_t _elemsize, Allocator* _allocator)
- {
- if (dims == 4 && w == _w && h == _h && d == _d && c == _c && elemsize == _elemsize && elempack == 1 && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = 1;
- allocator = _allocator;
-
- dims = 4;
- w = _w;
- h = _h;
- d = _d;
- c = _c;
-
- cstep = alignSize((size_t)w * h * d * elemsize, 16) / elemsize;
-
- size_t totalsize = alignSize(total() * elemsize, 4);
- if (totalsize > 0)
- {
- if (allocator)
- data = allocator->fastMalloc(totalsize + (int)sizeof(*refcount));
- else
- data = fastMalloc(totalsize + (int)sizeof(*refcount));
- }
-
- if (data)
- {
- refcount = (int*)(((unsigned char*)data) + totalsize);
- *refcount = 1;
- }
- }
-
- void Mat::create(int _w, size_t _elemsize, int _elempack, Allocator* _allocator)
- {
- if (dims == 1 && w == _w && elemsize == _elemsize && elempack == _elempack && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = _elempack;
- allocator = _allocator;
-
- dims = 1;
- w = _w;
- h = 1;
- d = 1;
- c = 1;
-
- cstep = alignSize(w * elemsize, 16) / elemsize;
-
- size_t totalsize = alignSize(total() * elemsize, 4);
- if (totalsize > 0)
- {
- if (allocator)
- data = allocator->fastMalloc(totalsize + (int)sizeof(*refcount));
- else
- data = fastMalloc(totalsize + (int)sizeof(*refcount));
- }
-
- if (data)
- {
- refcount = (int*)(((unsigned char*)data) + totalsize);
- *refcount = 1;
- }
- }
-
- void Mat::create(int _w, int _h, size_t _elemsize, int _elempack, Allocator* _allocator)
- {
- if (dims == 2 && w == _w && h == _h && elemsize == _elemsize && elempack == _elempack && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = _elempack;
- allocator = _allocator;
-
- dims = 2;
- w = _w;
- h = _h;
- d = 1;
- c = 1;
-
- cstep = alignSize((size_t)w * h * elemsize, 16) / elemsize;
-
- size_t totalsize = alignSize(total() * elemsize, 4);
- if (totalsize > 0)
- {
- if (allocator)
- data = allocator->fastMalloc(totalsize + (int)sizeof(*refcount));
- else
- data = fastMalloc(totalsize + (int)sizeof(*refcount));
- }
-
- if (data)
- {
- refcount = (int*)(((unsigned char*)data) + totalsize);
- *refcount = 1;
- }
- }
-
- void Mat::create(int _w, int _h, int _c, size_t _elemsize, int _elempack, Allocator* _allocator)
- {
- if (dims == 3 && w == _w && h == _h && c == _c && elemsize == _elemsize && elempack == _elempack && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = _elempack;
- allocator = _allocator;
-
- dims = 3;
- w = _w;
- h = _h;
- d = 1;
- c = _c;
-
- cstep = alignSize((size_t)w * h * elemsize, 16) / elemsize;
-
- size_t totalsize = alignSize(total() * elemsize, 4);
- if (totalsize > 0)
- {
- if (allocator)
- data = allocator->fastMalloc(totalsize + (int)sizeof(*refcount));
- else
- data = fastMalloc(totalsize + (int)sizeof(*refcount));
- }
-
- if (data)
- {
- refcount = (int*)(((unsigned char*)data) + totalsize);
- *refcount = 1;
- }
- }
-
- void Mat::create(int _w, int _h, int _d, int _c, size_t _elemsize, int _elempack, Allocator* _allocator)
- {
- if (dims == 4 && w == _w && h == _h && d == _d && c == _c && elemsize == _elemsize && elempack == _elempack && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = _elempack;
- allocator = _allocator;
-
- dims = 4;
- w = _w;
- h = _h;
- d = _d;
- c = _c;
-
- cstep = alignSize((size_t)w * h * d * elemsize, 16) / elemsize;
-
- size_t totalsize = alignSize(total() * elemsize, 4);
- if (totalsize > 0)
- {
- if (allocator)
- data = allocator->fastMalloc(totalsize + (int)sizeof(*refcount));
- else
- data = fastMalloc(totalsize + (int)sizeof(*refcount));
- }
-
- if (data)
- {
- refcount = (int*)(((unsigned char*)data) + totalsize);
- *refcount = 1;
- }
- }
-
- void Mat::create_like(const Mat& m, Allocator* _allocator)
- {
- int _dims = m.dims;
- if (_dims == 1)
- create(m.w, m.elemsize, m.elempack, _allocator);
- if (_dims == 2)
- create(m.w, m.h, m.elemsize, m.elempack, _allocator);
- if (_dims == 3)
- create(m.w, m.h, m.c, m.elemsize, m.elempack, _allocator);
- if (_dims == 4)
- create(m.w, m.h, m.d, m.c, m.elemsize, m.elempack, _allocator);
- }
-
- #if NCNN_VULKAN
- void Mat::create_like(const VkMat& m, Allocator* _allocator)
- {
- int _dims = m.dims;
- if (_dims == 1)
- create(m.w, m.elemsize, m.elempack, _allocator);
- if (_dims == 2)
- create(m.w, m.h, m.elemsize, m.elempack, _allocator);
- if (_dims == 3)
- create(m.w, m.h, m.c, m.elemsize, m.elempack, _allocator);
- if (_dims == 4)
- create(m.w, m.h, m.d, m.c, m.elemsize, m.elempack, _allocator);
- }
-
- void Mat::create_like(const VkImageMat& im, Allocator* _allocator)
- {
- int _dims = im.dims;
- if (_dims == 1)
- create(im.w, im.elemsize, im.elempack, _allocator);
- if (_dims == 2)
- create(im.w, im.h, im.elemsize, im.elempack, _allocator);
- if (_dims == 3)
- create(im.w, im.h, im.c, im.elemsize, im.elempack, _allocator);
- if (_dims == 4)
- create(im.w, im.h, im.d, im.c, im.elemsize, im.elempack, _allocator);
- }
- #endif // NCNN_VULKAN
-
- #if NCNN_VULKAN
- void VkMat::create(int _w, size_t _elemsize, VkAllocator* _allocator)
- {
- if (dims == 1 && w == _w && elemsize == _elemsize && elempack == 1 && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = 1;
- allocator = _allocator;
-
- dims = 1;
- w = _w;
- h = 1;
- d = 1;
- c = 1;
-
- cstep = alignSize(w * elemsize, 16) / elemsize;
-
- if (total() > 0)
- {
- size_t totalsize = alignSize(total() * elemsize, 4);
-
- data = allocator->fastMalloc(totalsize);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkBufferMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkMat::create(int _w, int _h, size_t _elemsize, VkAllocator* _allocator)
- {
- if (dims == 2 && w == _w && h == _h && elemsize == _elemsize && elempack == 1 && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = 1;
- allocator = _allocator;
-
- dims = 2;
- w = _w;
- h = _h;
- d = 1;
- c = 1;
-
- cstep = alignSize((size_t)w * h * elemsize, 16) / elemsize;
-
- if (total() > 0)
- {
- size_t totalsize = alignSize(total() * elemsize, 4);
-
- data = allocator->fastMalloc(totalsize);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkBufferMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkMat::create(int _w, int _h, int _c, size_t _elemsize, VkAllocator* _allocator)
- {
- if (dims == 3 && w == _w && h == _h && c == _c && elemsize == _elemsize && elempack == 1 && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = 1;
- allocator = _allocator;
-
- dims = 3;
- w = _w;
- h = _h;
- d = 1;
- c = _c;
-
- cstep = alignSize((size_t)w * h * elemsize, 16) / elemsize;
-
- if (total() > 0)
- {
- size_t totalsize = alignSize(total() * elemsize, 4);
-
- data = allocator->fastMalloc(totalsize);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkBufferMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkMat::create(int _w, int _h, int _d, int _c, size_t _elemsize, VkAllocator* _allocator)
- {
- if (dims == 4 && w == _w && h == _h && d == _d && c == _c && elemsize == _elemsize && elempack == 1 && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = 1;
- allocator = _allocator;
-
- dims = 4;
- w = _w;
- h = _h;
- d = _d;
- c = _c;
-
- cstep = alignSize((size_t)w * h * d * elemsize, 16) / elemsize;
-
- if (total() > 0)
- {
- size_t totalsize = alignSize(total() * elemsize, 4);
-
- data = allocator->fastMalloc(totalsize);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkBufferMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkMat::create(int _w, size_t _elemsize, int _elempack, VkAllocator* _allocator)
- {
- if (dims == 1 && w == _w && elemsize == _elemsize && elempack == _elempack && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = _elempack;
- allocator = _allocator;
-
- dims = 1;
- w = _w;
- h = 1;
- d = 1;
- c = 1;
-
- cstep = alignSize(w * elemsize, 16) / elemsize;
-
- if (total() > 0)
- {
- size_t totalsize = alignSize(total() * elemsize, 4);
-
- data = allocator->fastMalloc(totalsize);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkBufferMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkMat::create(int _w, int _h, size_t _elemsize, int _elempack, VkAllocator* _allocator)
- {
- if (dims == 2 && w == _w && h == _h && elemsize == _elemsize && elempack == _elempack && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = _elempack;
- allocator = _allocator;
-
- dims = 2;
- w = _w;
- h = _h;
- d = 1;
- c = 1;
-
- cstep = alignSize((size_t)w * h * elemsize, 16) / elemsize;
-
- if (total() > 0)
- {
- size_t totalsize = alignSize(total() * elemsize, 4);
-
- data = allocator->fastMalloc(totalsize);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkBufferMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkMat::create(int _w, int _h, int _c, size_t _elemsize, int _elempack, VkAllocator* _allocator)
- {
- if (dims == 3 && w == _w && h == _h && c == _c && elemsize == _elemsize && elempack == _elempack && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = _elempack;
- allocator = _allocator;
-
- dims = 3;
- w = _w;
- h = _h;
- d = 1;
- c = _c;
-
- cstep = alignSize((size_t)w * h * elemsize, 16) / elemsize;
-
- if (total() > 0)
- {
- size_t totalsize = alignSize(total() * elemsize, 4);
-
- data = allocator->fastMalloc(totalsize);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkBufferMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkMat::create(int _w, int _h, int _d, int _c, size_t _elemsize, int _elempack, VkAllocator* _allocator)
- {
- if (dims == 4 && w == _w && h == _h && d == _d && c == _c && elemsize == _elemsize && elempack == _elempack && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = _elempack;
- allocator = _allocator;
-
- dims = 4;
- w = _w;
- h = _h;
- d = _d;
- c = _c;
-
- cstep = alignSize((size_t)w * h * d * elemsize, 16) / elemsize;
-
- if (total() > 0)
- {
- size_t totalsize = alignSize(total() * elemsize, 4);
-
- data = allocator->fastMalloc(totalsize);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkBufferMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkMat::create_like(const Mat& m, VkAllocator* _allocator)
- {
- int _dims = m.dims;
- if (_dims == 1)
- create(m.w, m.elemsize, m.elempack, _allocator);
- if (_dims == 2)
- create(m.w, m.h, m.elemsize, m.elempack, _allocator);
- if (_dims == 3)
- create(m.w, m.h, m.c, m.elemsize, m.elempack, _allocator);
- if (_dims == 4)
- create(m.w, m.h, m.d, m.c, m.elemsize, m.elempack, _allocator);
- }
-
- void VkMat::create_like(const VkMat& m, VkAllocator* _allocator)
- {
- int _dims = m.dims;
- if (_dims == 1)
- create(m.w, m.elemsize, m.elempack, _allocator);
- if (_dims == 2)
- create(m.w, m.h, m.elemsize, m.elempack, _allocator);
- if (_dims == 3)
- create(m.w, m.h, m.c, m.elemsize, m.elempack, _allocator);
- if (_dims == 4)
- create(m.w, m.h, m.d, m.c, m.elemsize, m.elempack, _allocator);
- }
-
- void VkMat::create_like(const VkImageMat& im, VkAllocator* _allocator)
- {
- int _dims = im.dims;
- if (_dims == 1)
- create(im.w, im.elemsize, im.elempack, _allocator);
- if (_dims == 2)
- create(im.w, im.h, im.elemsize, im.elempack, _allocator);
- if (_dims == 3)
- create(im.w, im.h, im.c, im.elemsize, im.elempack, _allocator);
- if (_dims == 4)
- create(im.w, im.h, im.d, im.c, im.elemsize, im.elempack, _allocator);
- }
-
- void VkImageMat::create(int _w, size_t _elemsize, VkAllocator* _allocator)
- {
- if (dims == 1 && w == _w && elemsize == _elemsize && elempack == 1 && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = 1;
- allocator = _allocator;
-
- dims = 1;
- w = _w;
- h = 1;
- d = 1;
- c = 1;
-
- if (total() > 0)
- {
- data = allocator->fastMalloc(w, h, c, elemsize, elempack);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkImageMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkImageMat::create(int _w, int _h, size_t _elemsize, VkAllocator* _allocator)
- {
- if (dims == 2 && w == _w && h == _h && elemsize == _elemsize && elempack == 1 && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = 1;
- allocator = _allocator;
-
- dims = 2;
- w = _w;
- h = _h;
- d = 1;
- c = 1;
-
- if (total() > 0)
- {
- data = allocator->fastMalloc(w, h, c, elemsize, elempack);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkImageMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkImageMat::create(int _w, int _h, int _c, size_t _elemsize, VkAllocator* _allocator)
- {
- if (dims == 3 && w == _w && h == _h && c == _c && elemsize == _elemsize && elempack == 1 && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = 1;
- allocator = _allocator;
-
- dims = 3;
- w = _w;
- h = _h;
- d = 1;
- c = _c;
-
- if (total() > 0)
- {
- data = allocator->fastMalloc(w, h, c, elemsize, elempack);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkImageMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkImageMat::create(int _w, int _h, int _d, int _c, size_t _elemsize, VkAllocator* _allocator)
- {
- if (dims == 4 && w == _w && h == _h && d == _d && c == _c && elemsize == _elemsize && elempack == 1 && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = 1;
- allocator = _allocator;
-
- dims = 4;
- w = _w;
- h = _h;
- d = _d;
- c = _c;
-
- if (total() > 0)
- {
- // underlying image is 3d
- data = allocator->fastMalloc(w, h * d, c, elemsize, elempack);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkImageMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkImageMat::create(int _w, size_t _elemsize, int _elempack, VkAllocator* _allocator)
- {
- if (dims == 1 && w == _w && elemsize == _elemsize && elempack == _elempack && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = _elempack;
- allocator = _allocator;
-
- dims = 1;
- w = _w;
- h = 1;
- d = 1;
- c = 1;
-
- if (total() > 0)
- {
- data = allocator->fastMalloc(w, h, c, elemsize, elempack);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkImageMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkImageMat::create(int _w, int _h, size_t _elemsize, int _elempack, VkAllocator* _allocator)
- {
- if (dims == 2 && w == _w && h == _h && elemsize == _elemsize && elempack == _elempack && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = _elempack;
- allocator = _allocator;
-
- dims = 2;
- w = _w;
- h = _h;
- d = 1;
- c = 1;
-
- if (total() > 0)
- {
- data = allocator->fastMalloc(w, h, c, elemsize, elempack);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkImageMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkImageMat::create(int _w, int _h, int _c, size_t _elemsize, int _elempack, VkAllocator* _allocator)
- {
- if (dims == 3 && w == _w && h == _h && c == _c && elemsize == _elemsize && elempack == _elempack && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = _elempack;
- allocator = _allocator;
-
- dims = 3;
- w = _w;
- h = _h;
- d = 1;
- c = _c;
-
- if (total() > 0)
- {
- data = allocator->fastMalloc(w, h, c, elemsize, elempack);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkImageMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkImageMat::create(int _w, int _h, int _d, int _c, size_t _elemsize, int _elempack, VkAllocator* _allocator)
- {
- if (dims == 4 && w == _w && h == _h && d == _d && c == _c && elemsize == _elemsize && elempack == _elempack && allocator == _allocator)
- return;
-
- release();
-
- elemsize = _elemsize;
- elempack = _elempack;
- allocator = _allocator;
-
- dims = 4;
- w = _w;
- h = _h;
- d = _d;
- c = _c;
-
- if (total() > 0)
- {
- // underlying image is 3d
- data = allocator->fastMalloc(w, h * d, c, elemsize, elempack);
- }
-
- if (data)
- {
- refcount = (int*)((unsigned char*)data + offsetof(VkImageMemory, refcount));
- *refcount = 1;
- }
- }
-
- void VkImageMat::create_like(const Mat& m, VkAllocator* _allocator)
- {
- int _dims = m.dims;
- if (_dims == 1)
- create(m.w, m.elemsize, m.elempack, _allocator);
- if (_dims == 2)
- create(m.w, m.h, m.elemsize, m.elempack, _allocator);
- if (_dims == 3)
- create(m.w, m.h, m.c, m.elemsize, m.elempack, _allocator);
- if (_dims == 4)
- create(m.w, m.h, m.d, m.c, m.elemsize, m.elempack, _allocator);
- }
-
- void VkImageMat::create_like(const VkMat& m, VkAllocator* _allocator)
- {
- int _dims = m.dims;
- if (_dims == 1)
- create(m.w, m.elemsize, m.elempack, _allocator);
- if (_dims == 2)
- create(m.w, m.h, m.elemsize, m.elempack, _allocator);
- if (_dims == 3)
- create(m.w, m.h, m.c, m.elemsize, m.elempack, _allocator);
- if (_dims == 4)
- create(m.w, m.h, m.d, m.c, m.elemsize, m.elempack, _allocator);
- }
-
- void VkImageMat::create_like(const VkImageMat& im, VkAllocator* _allocator)
- {
- int _dims = im.dims;
- if (_dims == 1)
- create(im.w, im.elemsize, im.elempack, _allocator);
- if (_dims == 2)
- create(im.w, im.h, im.elemsize, im.elempack, _allocator);
- if (_dims == 3)
- create(im.w, im.h, im.c, im.elemsize, im.elempack, _allocator);
- if (_dims == 4)
- create(im.w, im.h, im.d, im.c, im.elemsize, im.elempack, _allocator);
- }
- #endif // NCNN_VULKAN
-
- void Mat::substract_mean_normalize(const float* mean_vals, const float* norm_vals)
- {
- Layer* op;
-
- if (mean_vals && !norm_vals)
- {
- // substract mean only
- op = create_layer(LayerType::Bias);
-
- ParamDict pd;
- pd.set(0, c);
-
- op->load_param(pd);
-
- Mat weights[1];
- weights[0] = Mat(c);
- for (int q = 0; q < c; q++)
- {
- weights[0][q] = -mean_vals[q];
- }
-
- op->load_model(ModelBinFromMatArray(weights));
- }
- else if (!mean_vals && norm_vals)
- {
- // normalize only
- op = create_layer(LayerType::Scale);
-
- ParamDict pd;
- pd.set(0, c);
-
- op->load_param(pd);
-
- Mat weights[1];
- weights[0] = Mat(c);
- for (int q = 0; q < c; q++)
- {
- weights[0][q] = norm_vals[q];
- }
-
- op->load_model(ModelBinFromMatArray(weights));
- }
- else if (mean_vals && norm_vals)
- {
- // substract mean and normalize
- op = create_layer(LayerType::Scale);
-
- ParamDict pd;
- pd.set(0, c);
- pd.set(1, 1);
-
- op->load_param(pd);
-
- Mat weights[2];
- weights[0] = Mat(c);
- weights[1] = Mat(c);
- for (int q = 0; q < c; q++)
- {
- weights[0][q] = norm_vals[q];
- weights[1][q] = -mean_vals[q] * norm_vals[q];
- }
-
- op->load_model(ModelBinFromMatArray(weights));
- }
- else // if (!mean_vals && !norm_vals)
- {
- return;
- }
-
- Option opt;
- opt.num_threads = 1; // TODO
-
- op->create_pipeline(opt);
-
- op->forward_inplace(*this, opt);
-
- op->destroy_pipeline(opt);
-
- delete op;
- }
-
- Mat Mat::from_float16(const unsigned short* data, int size)
- {
- Mat src(size, (void*)data, (size_t)2u);
- Mat dst;
-
- Option opt;
- opt.num_threads = 1; // TODO
- cast_float16_to_float32(src, dst, opt);
-
- return dst;
- }
-
- #if NCNN_VULKAN
- #if NCNN_PLATFORM_API
- #if __ANDROID_API__ >= 26
- VkImageMat VkImageMat::from_android_hardware_buffer(VkAndroidHardwareBufferImageAllocator* allocator)
- {
- int width = allocator->width();
- int height = allocator->height();
- size_t elemsize = 4u; // elemsize for ahb is actually just a placeholder
-
- return VkImageMat(width, height, elemsize, allocator);
- }
- #endif // __ANDROID_API__ >= 26
- #endif // NCNN_PLATFORM_API
- #endif // NCNN_VULKAN
-
- unsigned short float32_to_float16(float value)
- {
- // 1 : 8 : 23
- union
- {
- unsigned int u;
- float f;
- } tmp;
-
- tmp.f = value;
-
- // 1 : 8 : 23
- unsigned short sign = (tmp.u & 0x80000000) >> 31;
- unsigned short exponent = (tmp.u & 0x7F800000) >> 23;
- unsigned int significand = tmp.u & 0x7FFFFF;
-
- // NCNN_LOGE("%d %d %d", sign, exponent, significand);
-
- // 1 : 5 : 10
- unsigned short fp16;
- if (exponent == 0)
- {
- // zero or denormal, always underflow
- fp16 = (sign << 15) | (0x00 << 10) | 0x00;
- }
- else if (exponent == 0xFF)
- {
- // infinity or NaN
- fp16 = (sign << 15) | (0x1F << 10) | (significand ? 0x200 : 0x00);
- }
- else
- {
- // normalized
- short newexp = exponent + (-127 + 15);
- if (newexp >= 31)
- {
- // overflow, return infinity
- fp16 = (sign << 15) | (0x1F << 10) | 0x00;
- }
- else if (newexp <= 0)
- {
- // Some normal fp32 cannot be expressed as normal fp16
- fp16 = (sign << 15) | (0x00 << 10) | 0x00;
- }
- else
- {
- // normal fp16
- fp16 = (sign << 15) | (newexp << 10) | (significand >> 13);
- }
- }
-
- return fp16;
- }
-
- float float16_to_float32(unsigned short value)
- {
- // 1 : 5 : 10
- unsigned short sign = (value & 0x8000) >> 15;
- unsigned short exponent = (value & 0x7c00) >> 10;
- unsigned short significand = value & 0x03FF;
-
- // NCNN_LOGE("%d %d %d", sign, exponent, significand);
-
- // 1 : 8 : 23
- union
- {
- unsigned int u;
- float f;
- } tmp;
- if (exponent == 0)
- {
- if (significand == 0)
- {
- // zero
- tmp.u = (sign << 31);
- }
- else
- {
- // denormal
- exponent = 0;
- // find non-zero bit
- while ((significand & 0x200) == 0)
- {
- significand <<= 1;
- exponent++;
- }
- significand <<= 1;
- significand &= 0x3FF;
- tmp.u = (sign << 31) | ((-exponent + (-15 + 127)) << 23) | (significand << 13);
- }
- }
- else if (exponent == 0x1F)
- {
- // infinity or NaN
- tmp.u = (sign << 31) | (0xFF << 23) | (significand << 13);
- }
- else
- {
- // normalized
- tmp.u = (sign << 31) | ((exponent + (-15 + 127)) << 23) | (significand << 13);
- }
-
- return tmp.f;
- }
-
- void copy_make_border(const Mat& src, Mat& dst, int top, int bottom, int left, int right, int type, float v, const Option& opt)
- {
- Layer* padding = create_layer(LayerType::Padding);
-
- ParamDict pd;
- pd.set(0, top);
- pd.set(1, bottom);
- pd.set(2, left);
- pd.set(3, right);
- pd.set(4, type);
- pd.set(5, v);
-
- padding->load_param(pd);
-
- padding->create_pipeline(opt);
-
- padding->forward(src, dst, opt);
-
- padding->destroy_pipeline(opt);
-
- delete padding;
- }
-
- void copy_make_border_3d(const Mat& src, Mat& dst, int top, int bottom, int left, int right, int front, int behind, int type, float v, const Option& opt)
- {
- Layer* padding = create_layer(LayerType::Padding);
-
- ParamDict pd;
- pd.set(0, top);
- pd.set(1, bottom);
- pd.set(2, left);
- pd.set(3, right);
- pd.set(4, type);
- pd.set(5, v);
- pd.set(7, front);
- pd.set(8, behind);
-
- padding->load_param(pd);
-
- padding->create_pipeline(opt);
-
- padding->forward(src, dst, opt);
-
- padding->destroy_pipeline(opt);
-
- delete padding;
- }
-
- void copy_cut_border(const Mat& src, Mat& dst, int top, int bottom, int left, int right, const Option& opt)
- {
- if (left + right > src.w || top + bottom > src.h)
- {
- NCNN_LOGE("copy_cut_border parameter error, top: %d, bottom: %d, left: %d, right: %d, src.w: %d, src.h: %d", top, bottom, left, right, src.w, src.h);
- return;
- }
- Layer* crop = create_layer(LayerType::Crop);
-
- ParamDict pd;
- pd.set(0, left);
- pd.set(1, top);
- pd.set(2, 0);
- pd.set(3, src.w - left - right);
- pd.set(4, src.h - top - bottom);
- pd.set(5, -233);
-
- crop->load_param(pd);
-
- crop->create_pipeline(opt);
-
- crop->forward(src, dst, opt);
-
- crop->destroy_pipeline(opt);
-
- delete crop;
- }
-
- void copy_cut_border_3d(const Mat& src, Mat& dst, int top, int bottom, int left, int right, int front, int behind, const Option& opt)
- {
- if (left + right > src.w || top + bottom > src.h || front + behind > src.d)
- {
- NCNN_LOGE("copy_cut_border_3d parameter error, top: %d, bottom: %d, left: %d, right: %d, front: %d, behind: %d, src.w: %d, src.h: %d, src.d: %d", top, bottom, left, right, front, behind, src.w, src.h, src.d);
- return;
- }
- Layer* crop = create_layer(LayerType::Crop);
-
- ParamDict pd;
- pd.set(0, left);
- pd.set(1, top);
- pd.set(13, front);
- pd.set(2, 0);
- pd.set(3, src.w - left - right);
- pd.set(4, src.h - top - bottom);
- pd.set(14, src.d - front - behind);
- pd.set(5, -233);
-
- crop->load_param(pd);
-
- crop->create_pipeline(opt);
-
- crop->forward(src, dst, opt);
-
- crop->destroy_pipeline(opt);
-
- delete crop;
- }
-
- void resize_nearest(const Mat& src, Mat& dst, int w, int h, const Option& opt)
- {
- Layer* interp = create_layer(LayerType::Interp);
-
- ParamDict pd;
- pd.set(0, 1);
- pd.set(3, h);
- pd.set(4, w);
-
- interp->load_param(pd);
-
- interp->create_pipeline(opt);
-
- interp->forward(src, dst, opt);
-
- interp->destroy_pipeline(opt);
-
- delete interp;
- }
-
- void resize_bilinear(const Mat& src, Mat& dst, int w, int h, const Option& opt)
- {
- Layer* interp = create_layer(LayerType::Interp);
-
- ParamDict pd;
- pd.set(0, 2);
- pd.set(3, h);
- pd.set(4, w);
-
- interp->load_param(pd);
-
- interp->create_pipeline(opt);
-
- interp->forward(src, dst, opt);
-
- interp->destroy_pipeline(opt);
-
- delete interp;
- }
-
- void resize_bicubic(const Mat& src, Mat& dst, int w, int h, const Option& opt)
- {
- Layer* interp = create_layer(LayerType::Interp);
-
- ParamDict pd;
- pd.set(0, 3);
- pd.set(3, h);
- pd.set(4, w);
-
- interp->load_param(pd);
-
- interp->create_pipeline(opt);
-
- interp->forward(src, dst, opt);
-
- interp->destroy_pipeline(opt);
-
- delete interp;
- }
-
- void convert_packing(const Mat& src, Mat& dst, int _elempack, const Option& opt)
- {
- Layer* packing = create_layer(LayerType::Packing);
-
- ParamDict pd;
- pd.set(0, _elempack);
-
- packing->load_param(pd);
-
- packing->create_pipeline(opt);
-
- packing->forward(src, dst, opt);
-
- packing->destroy_pipeline(opt);
-
- delete packing;
- }
-
- void flatten(const Mat& src, Mat& dst, const Option& opt)
- {
- Layer* flatten = create_layer(LayerType::Flatten);
-
- ParamDict pd;
-
- flatten->load_param(pd);
-
- flatten->create_pipeline(opt);
-
- flatten->forward(src, dst, opt);
-
- flatten->destroy_pipeline(opt);
-
- delete flatten;
- }
-
- void cast_float32_to_float16(const Mat& src, Mat& dst, const Option& opt)
- {
- Layer* cast = create_layer(LayerType::Cast);
-
- ParamDict pd;
- pd.set(0, 1);
- pd.set(1, 2);
-
- cast->load_param(pd);
-
- cast->create_pipeline(opt);
-
- cast->forward(src, dst, opt);
-
- cast->destroy_pipeline(opt);
-
- delete cast;
- }
-
- void cast_float16_to_float32(const Mat& src, Mat& dst, const Option& opt)
- {
- Layer* cast = create_layer(LayerType::Cast);
-
- ParamDict pd;
- pd.set(0, 2);
- pd.set(1, 1);
-
- cast->load_param(pd);
-
- cast->create_pipeline(opt);
-
- cast->forward(src, dst, opt);
-
- cast->destroy_pipeline(opt);
-
- delete cast;
- }
-
- void cast_int8_to_float32(const Mat& src, Mat& dst, const Option& opt)
- {
- Layer* cast = create_layer(LayerType::Cast);
-
- ParamDict pd;
- pd.set(0, 3);
- pd.set(1, 1);
-
- cast->load_param(pd);
-
- cast->create_pipeline(opt);
-
- cast->forward(src, dst, opt);
-
- cast->destroy_pipeline(opt);
-
- delete cast;
- }
-
- void cast_float32_to_bfloat16(const Mat& src, Mat& dst, const Option& opt)
- {
- Layer* cast = create_layer(LayerType::Cast);
-
- ParamDict pd;
- pd.set(0, 1);
- pd.set(1, 4);
-
- cast->load_param(pd);
-
- cast->create_pipeline(opt);
-
- cast->forward(src, dst, opt);
-
- cast->destroy_pipeline(opt);
-
- delete cast;
- }
-
- void cast_bfloat16_to_float32(const Mat& src, Mat& dst, const Option& opt)
- {
- Layer* cast = create_layer(LayerType::Cast);
-
- ParamDict pd;
- pd.set(0, 4);
- pd.set(1, 1);
-
- cast->load_param(pd);
-
- cast->create_pipeline(opt);
-
- cast->forward(src, dst, opt);
-
- cast->destroy_pipeline(opt);
-
- delete cast;
- }
-
- void quantize_to_int8(const Mat& src, Mat& dst, const Mat& scale_data, const Option& opt)
- {
- Layer* quantize = create_layer(LayerType::Quantize);
-
- ParamDict pd;
- pd.set(0, scale_data.w);
-
- quantize->load_param(pd);
-
- Mat weights[1];
- weights[0] = scale_data;
-
- quantize->load_model(ModelBinFromMatArray(weights));
-
- quantize->create_pipeline(opt);
-
- quantize->forward(src, dst, opt);
-
- quantize->destroy_pipeline(opt);
-
- delete quantize;
- }
-
- void dequantize_from_int32(const Mat& src, Mat& dst, const Mat& scale_data, const Mat& bias_data, const Option& opt)
- {
- Layer* dequantize = create_layer(LayerType::Dequantize);
-
- ParamDict pd;
- pd.set(0, scale_data.w);
- pd.set(1, bias_data.w);
-
- dequantize->load_param(pd);
-
- Mat weights[2];
- weights[0] = scale_data;
- weights[1] = bias_data;
-
- dequantize->load_model(ModelBinFromMatArray(weights));
-
- dequantize->create_pipeline(opt);
-
- dequantize->forward(src, dst, opt);
-
- dequantize->destroy_pipeline(opt);
-
- delete dequantize;
- }
-
- void requantize_from_int32_to_int8(const Mat& src, Mat& dst, const Mat& scale_in_data, const Mat& scale_out_data, const Mat& bias_data, int activation_type, const Mat& activation_params, const Option& opt)
- {
- Layer* requantize = create_layer(LayerType::Requantize);
-
- ParamDict pd;
- pd.set(0, scale_in_data.w);
- pd.set(1, scale_out_data.w);
- pd.set(2, bias_data.w);
- pd.set(3, activation_type);
- pd.set(4, activation_params);
-
- requantize->load_param(pd);
-
- Mat weights[3];
- weights[0] = scale_in_data;
- weights[1] = scale_out_data;
- weights[2] = bias_data;
-
- requantize->load_model(ModelBinFromMatArray(weights));
-
- requantize->create_pipeline(opt);
-
- requantize->forward(src, dst, opt);
-
- requantize->destroy_pipeline(opt);
-
- delete requantize;
- }
-
- } // namespace ncnn
|