初看起来,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以并行执行有用的工作?
谢谢!