xfcvDataMovers¶
xfcvDataMovers class object takes input some simple parameters from users and provides a simple data transaction API where user does not have to bother about the complexity. Moreover it provides a template parameter using which application can switch from PL based data movement to GMIO based (and vice versa) seamlessly. For more details please refer xfcvDataMovers.
Class Definition¶
template <DataMoverKind KIND,
typename DATA_TYPE,
int TILE_HEIGHT_MAX,
int TILE_WIDTH_MAX,
int AIE_VECTORIZATION_FACTOR,
int CORES = 1,
int PL_AXI_BITWIDTH = 32,
bool USE_GMIO = false>
class xfcvDataMovers {
//Tiler constructor
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == TILER)>::type* = nullptr>
xfcvDataMovers(uint16_t overlapH, uint16_t overlapV);
//Stitcher constructor
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == STITCHER)>::type* = nullptr>
xfcvDataMovers();
//Meta data computation
void compute_metadata(const cv::Size& img_size);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == TILER)>::type* = nullptr>
std::array<uint16_t, 2> host2aie_nb(cv::Mat& img, xrtBufferHandle imgHndl = nullptr);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == TILER)>::type* = nullptr>
std::array<uint16_t, 2> host2aie_nb(xrtBufferHandle imgHndl, const cv::Size& size);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == STITCHER)>::type* = nullptr>
void aie2host_nb(cv::Mat& img, std::array<uint16_t, 2> tiles, xrtBufferHandle imgHndl = nullptr);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == STITCHER)>::type* = nullptr>
void aie2host_nb(xrtBufferHandle imgHndl, const cv::Size& size, std::array<uint16_t, 2> tiles);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == TILER)>::type* = nullptr>
void wait();
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == STITCHER)>::type* = nullptr>
void wait();;
};
//GMIO class specialization
template <DataMoverKind KIND,
typename DATA_TYPE,
int TILE_HEIGHT_MAX,
int TILE_WIDTH_MAX,
int AIE_VECTORIZATION_FACTOR,
int CORES>
class xfcvDataMovers<KIND, DATA_TYPE, TILE_HEIGHT_MAX, TILE_WIDTH_MAX, AIE_VECTORIZATION_FACTOR, CORES, 0, true> {
//Tiler constructor
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == TILER)>::type* = nullptr>
xfcvDataMovers(uint16_t overlapH, uint16_t overlapV);
//Stitcher constructor
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == STITCHER)>::type* = nullptr>
xfcvDataMovers();
//Compute meta data
void compute_metadata(const cv::Size& img_size);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == TILER)>::type* = nullptr>
std::array<uint16_t, 2> host2aie_nb(DATA_TYPE* img_data, const cv::Size& img_size, std::array<std::string, CORES> portNames);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == TILER)>::type* = nullptr>
std::array<uint16_t, 2> host2aie_nb(cv::Mat& img, std::array<std::string, CORES> portNames);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == STITCHER)>::type* = nullptr>
void aie2host_nb(DATA_TYPE* img_data, const cv::Size& img_size, std::array<uint16_t, 2> tiles, std::array<std::string, CORES> portNames);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == STITCHER)>::type* = nullptr>
void aie2host_nb(cv::Mat& img, std::array<uint16_t, 2> tiles, std::array<std::string, CORES> portNames);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == TILER)>::type* = nullptr>
std::array<uint16_t, 2> host2aie(cv::Mat& img, std::array<std::string, CORES> portNames);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == TILER)>::type* = nullptr>
std::array<uint16_t, 2> host2aie(DATA_TYPE* img_data, const cv::Size& img_size, std::array<std::string, CORES> portNames);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == STITCHER)>::type* = nullptr>
void aie2host(cv::Mat& img, std::array<uint16_t, 2> tiles, std::array<std::string, CORES> portNames);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == STITCHER)>::type* = nullptr>
void aie2host(DATA_TYPE* img_data, const cv::Size& img_size, std::array<uint16_t, 2> tiles, std::array<std::string, CORES> portNames);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == TILER)>::type* = nullptr>
void wait(std::array<std::string, CORES> portNames);
template <DataMoverKind _t = KIND, typename std::enable_if<(_t == STITCHER)>::type* = nullptr>
void wait(std::array<std::string, CORES> portNames);
};
Member Functions | Description |
---|---|
xfcvDataMovers(uint16_t overlapH, uint16_t overlapV) | Tiler constructor using horizontal and vertical overlap sizes |
xfcvDataMovers() | Stitcher constructor |
host2aie_nb(cv::Mat& img, xrtBufferHandle imgHndl = nullptr) | Host to AIE non blocking transaction using input image. |
host2aie_nb(xrtBufferHandle imgHndl, const cv::Size& size) | Host to AIE non blocking transaction using XRT allocated buffer handle and image size |
aie2host_nb(cv::Mat& img, std::array<uint16_t, 2> tiles, xrtBufferHandle imgHndl = nullptr) | AIE to Host non blocking transaction using input image and {tile rows, tile cols} array |
aie2host_nb(xrtBufferHandle imgHndl, const cv::Size& size, std::array<uint16_t, 2> tiles) | AIE to Host non blocking transaction using XRT allocated buffer handle and image size |
wait() | Wait for transaction to complete |
Note
If XRT mapped buffer handle is associated with image it can also be passed to imgHndl argument avoid copy
Note
Parameter tiles can be obtained from tiler data transfer API host2aie_nb
Member Functions | Description |
---|---|
xfcvDataMovers(uint16_t overlapH, uint16_t overlapV) | Tiler constructor using horizontal and vertical overlap sizes |
xfcvDataMovers() | Stitcher constructor |
host2aie_nb(cv::Mat& img, std::array<std::string, CORES> portNames) | Host to AIE non blocking transaction using input image. |
host2aie_nb(DATA_TYPE* img_data, const cv::Size& size, std::array<std::string, CORES> portNames) | Host to AIE non blocking transaction using image data pointer and image size |
aie2host_nb(cv::Mat& img, std::array<std::string, CORES> portNames) | AIE to Host non blocking transaction using input image. |
aie2host_nb(DATA_TYPE* img_data, const cv::Size& size, std::array<std::string, CORES> portNames) | AIE to Host non blocking transaction using image data pointer and image size |
host2aie(cv::Mat& img, std::array<std::string, CORES> portNames) | Host to AIE blocking transaction using input image. |
host2aie(DATA_TYPE* img_data, const cv::Size& size, std::array<std::string, CORES> portNames) | Host to AIE blocking transaction using image data pointer and image size |
aie2host(cv::Mat& img, std::array<std::string, CORES> portNames) | AIE to Host blocking transaction using input image. |
aie2host(DATA_TYPE* img_data, const cv::Size& size, std::array<std::string, CORES> portNames) | AIE to Host blocking transaction using image data pointer and image size |
wait() | Wait for transaction to complete |
Note
Argument portNames correspond GMIO port declared as part of platform specification
Vitis Vision AIE Library Functions API list with performance estimates¶
Frames per second (FPS) measured from host-code and includes data-transfer latencies and AIEngine™ kernel latencies. Measurements done on VCK190 evaluation boards and use only one AIE core.
Function(xf::cv::aie) | Performance (FPS) with PL Data-movers(Full HD) | Performance (FPS) with PL Data-movers (4K) | Performance (FPS) with GMIO Data-movers(Full HD) | Performance (FPS) with GMIO Data-movers (4K) |
---|---|---|---|---|
absolutedifference | 284 | 80 | 128 | 50 |
accumulate | 280 | 79 | 137 | 48 |
accumulateweighted | 281 | 75 | 111 | 40 |
addweighted | 358 | 100 | 129 | 38 |
convertScaleAbs | 406 | 106 | 214 | 57 |
erode | 250 | 65 | 131 | 41 |
filter2D | 250 | 67 | 157 | 47 |
gainControl | 405 | 103 | 192 | 60 |
gaussian | 249 | 66 | 179 | 52 |
laplacian | 250 | 66 | 150 | 46 |
pixel_wise_mul | 362 | 102 | 170 | 51 |
threshold | 403 | 105 | 251 | 68 |
zero function | 405 | 103 | 204 | 66 |