1. 浮點數據定點化;

cv::Mat tmp1 = values * 1000000; tmp1.convertTo(tmp1, CV_32SC1); cv::Mat tmp2 = this->weights * 1000000; tmp2.convertTo(tmp2, CV_32SC1); cv::Mat tmp(tmp1.rows, tmp2.cols, CV_64FC1); tmp = tmp1 * tmp2 / 1000000000000.0f; tmp.convertTo(tmp, CV_32FC1);
opencv中cv::Mat數據矩陣乘法,需要各個數據的類型是一樣的,且需要注意數據溢出問題,以及矩陣乘法支持Mat矩陣的數據類型(type)只能是 CV_32FC1、 CV_64FC1、 CV_32FC2、 CV_64FC2 這4種類型中的其中一種。定點化一般指的是兩個浮點數據轉換為整形數據相乘,這樣才能加速,而我們的轉換過程矩陣乘法一直都是浮點數據相乘,所以對加速沒用,甚至會增加額外的轉換過程的耗時。
2. 使用eigen庫運算;
3. 使用加速優化的編譯選項;
使用浮點運算;使用neon;可以使用不同的架構選項、ARM選項等等;
QMAKE_CXXFLAGS += -march=armv8 -mfloat-abi=hard -mfpu=vfpv4-d16 -mfpu=neon
4. 使用多線程;
注意互斥鎖和信號量;
5. 使用多核並行編程;
openmp
參考
1. eigen;
2. GNU_GCC;
3. openmp_MSDN;
5. openmp_org;
完