我发现了一些有关在cv::dft
s vs cv::UMat
上执行cv::Mat
功能的有趣结果。基本上我发现UMat
s实际上要慢得多,直到图像达到4096x4096。在此之前,cv::Mat
始终如一。这是因为dft没有为TAPI api实现,只有CV :: Mat实现?我运行的测试看起来像这样(我使用celero项目来创建基准测试):
constexpr int num_samples = 2;
constexpr int num_iterations = 10;
constexpr int num_rows = 4096;
constexpr int num_cols = 4096;
cv::UMat a = cv::UMat(num_rows, num_cols, CV_32F);
cv::Mat b = cv::Mat(num_rows, num_cols, CV_32F);
void CreateUMat() { cv::randu(a, 0, 256); }
void CreateMat() { cv::randu(b, 0, 256); }
void DftUMat() {
CreateUMat();
cv::dft(a, a);
cv::idft(a, a, cv::DFT_SCALE | cv::DFT_INVERSE);
}
void DftMat() {
CreateMat();
cv::dft(b, b);
cv::idft(b, b, cv::DFT_SCALE | cv::DFT_INVERSE);
}
BASELINE(UMatBenchmarks, Baseline, num_samples, num_iterations) { DftUMat(); }
BENCHMARK(UMatBenchmarks, NoGPU, num_samples, num_iterations) { DftMat(); }
我得到了以下结果:
cv :: UMat iterations / sec = 4.51
cv :: Mat iterations / sec = 4.70
对于较小的图像,比如说1024x1024,我得到了以下结果:
cv :: UMat iterations / sec = 63.21
cv :: Mat iterations / sec = 85.83
从这些结果中,您可以看到将UMat用于大图像尺寸几乎没有优势,并且在较小的图像上尤其没有优势。这让我感到惊讶,因为在切换到OpenCV TAPI时,cv::matchTemplate
获得了重要的加速。我的猜测是cv::dft
尚未在OpenCL中实现,但情况确实如此吗? DFT只是一个不好的算法卸载到GPUS吗?谢谢!