使用OpenCV T-API,为什么纯GPU负载会导致非常高的CPU负载?

时间:2016-08-21 12:12:27

标签: c++ performance opencv opencl

初看起来,T-API效果很好,你只需要用cv :: UMat替换cv :: Mat,你的代码运行速度要快很多倍。

问题是,在纯GPU代码运行时,CPU也是100%。

这样,您无法充分利用CPU。

以下是使用OpenCV 3.1.0测试的代码,其中没有内存传输,但纯GPU计算,我希望这会导致0%CPU负载,但实际上它是100%或更多(测试时)很多机器)。

void test_tapi_inf() {
    int sum = 0;
    cv::UMat mat(1000, 1000, CV_8UC1);
    mat.setTo(1);

    while (true) {
        int64 tick1 = cv::getTickCount();
        for (int i = 0; i < 10000; i++) {
            sum = cv::sum(mat)[0];
        }
        int64 tick2 = cv::getTickCount();
        printf("time: %f, sum: %d\n", (tick2 - tick1) / cv::getTickFrequency(), sum);
    }
}

打印:

time: 0.961175, sum: 1000000
time: 1.097721, sum: 1000000
...

它比cv :: Mat版本快5倍,加载GPU,但不幸的是,它将CPU加载到100%或更多。

我注意到许多线程也使用cv :: UMat版本生成,同时CPU负载也很高。

我怀疑CPU一直在轮询GPU结果,没有例如在检查之间休息,或者阻塞直到有结果,导致类似CPU的忙循环。

为什么会这样?有没有办法在OpenCV中更改此行为,以便释放CPU以并行执行有用的工作?

谢谢!

0 个答案:

没有答案