设备是Atlas 500 A2,使用aclrtMemcpy进行内存拷贝,将多个hi_vpc_pic_info的内容拷贝到一个cv::Mat里,由于内存不连续所以只能逐行拷贝,速度很慢,一帧要100ms,代码如下:
for (int i = 0; i < num_images; i++) {
int offset = panoRois[i].x * image_concat.elemSize();
uchar* matPtr;
uchar* picPtr;
size_t matStride = image_concat.elemSize() * panoRois[i].width;
for (int j = 0; j < panoRois[i].height; j++) {
matPtr = image_concat.data + j * image_concat.step + offset;
picPtr = static_cast<uchar*>(croped_pic_info[i].picture_address) + j * croped_pic_info[i].picture_width_stride;
ret = aclrtMemcpy(matPtr, matStride, picPtr, matStride, ACL_MEMCPY_DEVICE_TO_DEVICE);
if (ret != ACL_SUCCESS) {
SAMPLE_PRT("Copy device to cv::Mat failed, ret = %d\n", ret);
return -1;
}
}
}
如果使用多stream速度更慢,因为aclrtMemcpyAsync下发就要1ms。使用dvpp的hi_mpi_vpc_crop_resize_paste速度又很快,只要6ms,但是要resize,hi_mpi_vpc_crop_resize_paste最大尺寸只支持4096。hi_mpi_vpc_crop_resize_paste内部是怎么实现的?怎么在不resize的前提下提高拷贝速度?
设备是Atlas 500 A2,使用aclrtMemcpy进行内存拷贝,将多个hi_vpc_pic_info的内容拷贝到一个cv::Mat里,由于内存不连续所以只能逐行拷贝,速度很慢,一帧要100ms,代码如下:
for (int i = 0; i < num_images; i++) {
int offset = panoRois[i].x * image_concat.elemSize();
uchar* matPtr;
uchar* picPtr;
size_t matStride = image_concat.elemSize() * panoRois[i].width;
for (int j = 0; j < panoRois[i].height; j++) {
matPtr = image_concat.data + j * image_concat.step + offset;
picPtr = static_cast<uchar*>(croped_pic_info[i].picture_address) + j * croped_pic_info[i].picture_width_stride;
ret = aclrtMemcpy(matPtr, matStride, picPtr, matStride, ACL_MEMCPY_DEVICE_TO_DEVICE);
if (ret != ACL_SUCCESS) {
SAMPLE_PRT("Copy device to cv::Mat failed, ret = %d\n", ret);
return -1;
}
}
}
如果使用多stream速度更慢,因为aclrtMemcpyAsync下发就要1ms。使用dvpp的hi_mpi_vpc_crop_resize_paste速度又很快,只要6ms,但是要resize,hi_mpi_vpc_crop_resize_paste最大尺寸只支持4096。hi_mpi_vpc_crop_resize_paste内部是怎么实现的?怎么在不resize的前提下提高拷贝速度?