如何在OpenCV 2.4中为随机森林启用并行化支持?

时间:2017-02-03 21:13:01

标签: c++ opencv openmp

我正在运行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已启用。

0 个答案:

没有答案
相关问题