我正在运行OpenCV 2.4.13。
我正在使用CvRTrees.train()和CvRTrees.predict()作为分类应用程序。
目前,CvRTrees.train()函数仅使用一个CPU核心。我可以在htop中看到这一点:当一个CPU处于100%时,其他CPU在调用train()时徘徊在3%左右。
文档说您必须明确启用并行化支持,因此我重新构建了具有OpenMP支持的库并重新安装。但是,行为是一样的。 train()只使用一个CPU。
有谁知道我做错了什么?我的期望是否不准确?
以下是我用来构建和安装的步骤:
在cmake中启用OpenMP
$ mkdir release && cd release
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_OPENMP=ON -D WITH_FFMPEG=OFF ..
制作并安装
$ make && sudo make install
运行ldconfig以使链接器缓存更新
$ sudo ldconfig
重建我的程序并在可执行文件上运行ldd
以确保它在/ usr / local / lib中使用我新安装的库
$ ldd ./build/release/classify | grep opencv
libopencv_core.so.2.4 => /usr/local/lib/libopencv_core.so.2.4 (0x00007f6e9d525000)
libopencv_ml.so.2.4 => /usr/local/lib/libopencv_ml.so.2.4 (0x00007f6e9d29e000)
另一个注意事项:如果我在下面的第261行添加语法错误,那么构建会中断,所以我知道我已经设置了正确的编译器标志。
modules/core/src/parallel.cpp
-----------------------------
259 #elif defined HAVE_OPENMP
260
261 #pragma omp parallel for schedule(dynamic)
262 for (int i = stripeRange.start; i < stripeRange.end; ++i)
263 pbody(Range(i, i + 1));
另一个注意事项:ldd告诉我我的应用程序链接了libgomp.so,所以我有理由相信OpenMP已启用。