巨大差異我具有3個輸入寫的函數(掩蔽):發送oclMat到函數創建在運行時
- inputOCL - 一個oclMat
- comparisonValue - 雙值
- 方法 - 一個int變量決定比較方法
對於我的示例,我選擇了method = 1,它代表CMP_GT,測試inputOCL> comparisonValue是否明智。
該函數的目的是將inputOCL中不符合給定copmarison的所有元素歸零。
下面是函數掩蔽:
void masking(cv::ocl::oclMat inputOCL, double comparisonValue, int method){
// NOTE: method can be set to 1-->5 corresponding to (==, >, >=, <, <=, !=)
cv::ocl::oclMat valueOCL(inputOCL.size(), inputOCL.type());
valueOCL.setTo(cv::Scalar(comparisonValue));
cv::ocl::oclMat logicalOCL;
cv::ocl::compare(inputOCL, valueOCL, logicalOCL, method);
logicalOCL.convertTo(logicalOCL, inputOCL.type());
cv::ocl::multiply(logicalOCL, inputOCL, inputOCL);
cv::ocl::multiply(1/255.0, inputOCL, inputOCL); }
當定時我發現在運行時運行該函數,或者直接運行的計算運行下面的代碼時之間的非常大的差異的函數:
int main(int argc, char** argv){
double value1 = 1.23456789;
double value2 = 1.23456789;
// initialize matrix
cv::Mat I(5000, 5000, CV_64F, cv::Scalar(value1));
// copy input to GPU
cv::ocl::oclMat inputOCL(I);
int method = 1;
static double start_TIMER;
// computation done in function
start_TIMER = cv::getTickCount();
masking(inputOCL, value2, method);
std::cout << "\nFunction runtime = " << ((double)(cv::getTickCount() - start_TIMER))/cv::getTickFrequency() << " Seconds\n";
// direct computation
start_TIMER = cv::getTickCount();
cv::ocl::oclMat valueOCL(inputOCL.size(), inputOCL.type());
valueOCL.setTo(cv::Scalar(value2));
cv::ocl::oclMat logicalOCL;
cv::ocl::compare(inputOCL, valueOCL, logicalOCL, method);
logicalOCL.convertTo(logicalOCL, inputOCL.type());
cv::ocl::multiply(logicalOCL, inputOCL, inputOCL);
cv::ocl::multiply(1/255.0, inputOCL, inputOCL);
std::cout << "\nDirect runtime = " << ((double)(cv::getTickCount() - start_TIMER))/cv::getTickFrequency() << " Seconds\n";
}
運行時可以在此屏幕截圖中看到:
運行時間爲什麼會有這麼大的差異?
只是出於興趣,你可以張貼結果從兩個couts – GPPK
什麼是你測量的運行時間的範圍? – Micka
我已將截圖添加到原始帖子。 –