【发布时间】:2015-05-19 07:18:28
【问题描述】:
我写了一个带有 3 个输入的函数(屏蔽):
- inputOCL - 一个 oclMat
- comparisonValue - 双精度值
- method - 确定比较方法的 int 变量
对于我的示例,我选择了 method=1,它代表 CMP_GT,测试 inputOCL>comparisonValue element-wise。
该函数的目的是将 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.23456789012345;
double value2 = 1.23456789012344;
// 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 的结果贴出来
-
您测量的运行时间范围是多少?
-
我在原帖中添加了截图。
-
在直接情况下,您似乎没有提到临时
oclMat销毁的时间。你也试过测量吗? -
你有另一个矩阵
valueOCL。你把两个都毁了吗?
标签: opencv image-processing opencl gpgpu